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
    


  • 相关阅读:
    JMF:Screen Grabber [DataSource]
    ImageUtilities.loadImage第二个参数的说明
    PipeStateListener和PipeEventListener
    as3 htmlText常用标签
    jsfl批量导出swf
    java socket安全策略文件
    模拟EventCenter,flash自带的事件机制的一个解耦框架,callback回调方式用于模块之间的通信
    flashDevelop快捷键和几个实用的插架
    as3 用StyleSheet css 设置文本样式
    as3 位图九宫格
  • 原文地址:https://www.cnblogs.com/wyang0126/p/5039918.html
Copyright © 2011-2022 走看看