zoukankan      html  css  js  c++  java
  • 装饰者模式

    装饰者模式

                 动态的将职责附加到对象上。

    系统描述:购买咖啡的系统,购买咖啡时可以加入各种调料,然后结账的时候算上咖啡和调料的钱的总和。

    总的饮料抽象类Beverage.java

    package cn.beverage.demo;
    
    /**
     * 饮料抽象类
     * 
     * @author wy
     * 
     */
    public abstract class Beverage {
    	String desc = "unknow Beverage";
    
    	public String getDesc() {
    		return this.desc;
    	}
    
    	public abstract double cost();
    }
    
     調料抽象類:Condiment.java:装饰者类必须继承最上层的饮料抽象类。

    package cn.beverage.demo;
    
    /**
     * 調料抽象類,装饰者类
     * 
     * @author wy
     * 
     */
    public abstract class Condiment extends Beverage {
    
    	public abstract String getDesc();
    }
    
    2个被装饰类:被装饰类基础最上层的饮料抽象类

    package cn.beverage.demo;
    
    /**
     * 被装饰的类
     * 
     * @author wy
     * 
     */
    public class Espresso extends Beverage {
    
    	public Espresso() {
    		this.desc = "濃縮咖啡";
    	}
    
    	@Override
    	public double cost() {
    		// TODO Auto-generated method stub
    		return 1.99;
    	}
    
    }
    package cn.beverage.demo;
    
    /**
     * 被装饰的类
     * 
     * @author wy
     * 
     */
    public class HouseBlend extends Beverage {
    
    	public HouseBlend() {
    		this.desc = "首选咖啡";
    	}
    
    	@Override
    	public double cost() {
    		// TODO Auto-generated method stub
    		return 0.89;
    	}
    
    }
    

    再添加两个装饰者:

    package cn.beverage.demo;
    
    /**
     * 裝飾者
     * 
     * @author wy
     * 
     */
    public class Mocha extends Condiment {
    
    	private Beverage beverage;
    
    	public Mocha(Beverage beverage) {
    		this.beverage = beverage;
    	}
    
    	@Override
    	public String getDesc() {
    		// TODO Auto-generated method stub
    		return beverage.getDesc() + ",摩卡";
    	}
    
    	@Override
    	public double cost() {
    		// TODO Auto-generated method stub
    		return 0.20 + beverage.cost();
    	}
    
    }
    

    package cn.beverage.demo;
    
    /**
     * 裝飾者
     * 
     * @author wy
     * 
     */
    public class Whip extends Condiment {
    
    	private Beverage beverage;
    
    	public Whip(Beverage beverage) {
    		this.beverage = beverage;
    	}
    
    	@Override
    	public String getDesc() {
    		// TODO Auto-generated method stub
    		return beverage.getDesc() + ",whip ";
    	}
    
    	@Override
    	public double cost() {
    		// TODO Auto-generated method stub
    		return 10 + beverage.cost();
    	}
    
    }
    
    测试方法:

    package cn.beverage.demo;
    
    public class Test {
    	public static void main(String[] args) {
    		Beverage beverage = new Espresso();
    		beverage = new Mocha(beverage);
    		System.out.println(beverage.getDesc() + " : " + beverage.cost());
    
    		Beverage beverage2 = new HouseBlend();
                    //用摩卡装饰beverage2
    beverage2 = new Mocha(beverage2);
    		System.out.println(beverage2.getDesc() + " : " + beverage2.cost());
    
    		Beverage beverage3 = new Espresso();
                    //用摩卡装饰beverage3
     beverage3 = new Mocha(beverage3);
                    //再用whip装饰beverage3
                    beverage3 = new Whip(beverage3);
    		System.out.println(beverage3.getDesc() + " : " + beverage3.cost());
    	}
    }
    

    输出结果:

    濃縮咖啡,摩卡 : 2.19
    首选咖啡,摩卡 : 1.09
    濃縮咖啡,摩卡,whip  : 12.19
    


  • 相关阅读:
    开发两年!JVM方法调用都玩不明白,你离被炒鱿鱼不远了!
    springboot基本框架搭建零基础教程,对新手极为友好!
    SpingBoot整合Mybatis,这些小技巧你得知道,对你工作有很大的帮助!
    今天我们基于jdk8聊聊JVM-常量池,希望对大家有帮助!
    剑指 Offer 12. 矩阵中的路径
    WUSTCTF2020 funnyre
    2020 DJBCTF RE wp
    黑马c++基础的一个通讯录系统
    elf文件结构解读以及plt节got节的理解
    ubuntu16.04上编译android的可执行文件并调用本地so库
  • 原文地址:https://www.cnblogs.com/wyang0126/p/5039918.html
Copyright © 2011-2022 走看看