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
    


  • 相关阅读:
    解决 Cordova 打包 vue项目为 APP 后,在安卓平台下 touchMove 事件不生效的问题
    解决微信内置浏览器里,下拉无法捕获 touchEnd 事件
    记录 React-native 项目中的各种坑坑
    内存型游戏外挂讲解
    浅谈数据抓取的几种方法
    php链表笔记:合并两个有序链表
    php链表笔记:链表的检测
    php链表笔记:单链表反转
    使用UUID和int自增主键的区别
    lumen框架使用Elasticsearch详解
  • 原文地址:https://www.cnblogs.com/wyang0126/p/5039918.html
Copyright © 2011-2022 走看看