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

    装饰者模式

    一、应用实例

    咖啡订单项目

    1. 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack、Decaf

    2)调料:Milk、Soy、Chocolate

    3)要求在扩展新的咖啡种类时,有良好的扩展性、改动方便。

    二、装饰者模式

    动态的将新功能附加到对象上。在对象功能扩展方面比继承更有弹性

    1.装饰者模式解决咖啡订单项目

    2.装饰者模式下的订单:2份巧克力里和一份牛奶的LongBlack

    3.代码实现

    public class CoffeeBar {
    	public static void main(String[] args) {
    		// 装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack
    		// 1. 点一份 LongBlack
    		Drink order = new LongBlack();
    		System.out.println("费用1=" + order.cost());
    		System.out.println("描述=" + order.getDes());
    
    		// 2. order 加入一份牛奶
    		order = new Milk(order);
    		System.out.println("order 加入一份牛奶 费用 =" + order.cost());
    		System.out.println("order 加入一份牛奶 描述 = " + order.getDes());
    
    		// 3. order 加入一份巧克力
    		order = new Chocolate(order);
    		System.out.println("order 加入一份牛奶 加入一份巧克力  费用 =" + order.cost());
    		System.out.println("order 加入一份牛奶 加入一份巧克力 描述 = " + order.getDes());
    
    		// 4. order 加入一份巧克力
    		order = new Chocolate(order);
    		System.out.println("order 加入一份牛奶 加入2份巧克力   费用 =" + order.cost());
    		System.out.println("order 加入一份牛奶 加入2份巧克力 描述 = " + order.getDes());
    	}
    }
    
    public abstract class Drink {
    	public String des; // 描述
    	private float price = 0.0f;
    	public String getDes() {
    		return des;
    	}
    	public void setDes(String des) {
    		this.des = des;
    	}
    	public float getPrice() {
    		return price;
    	}
    	public void setPrice(float price) {
    		this.price = price;
    	}
    	
    	//计算费用的抽象方法
    	//子类来实现
    	public abstract float cost();
    }
    
    public class Decorator extends Drink {
    	private Drink obj;
    	
    	public Decorator(Drink obj) { //组合
    		this.obj = obj;
    	}
    	@Override
    	public float cost() {
    		// getPrice 自己价格
    		return super.getPrice() + obj.cost();
    	}
    	
    	@Override
    	public String getDes() {
    		// obj.getDes() 输出被装饰者的信息
    		return des + " " + getPrice() + " && " + obj.getDes();
    	}
    }
    
    public class Coffee  extends Drink {
    	@Override
    	public float cost() {
    		return super.getPrice();
    	}
    }
    
    public class LongBlack extends Coffee {
    	public LongBlack() {
    		setDes(" longblack ");
    		setPrice(5.0f);
    	}
    }
    
    //具体的Decorator, 这里就是调味品
    public class Chocolate extends Decorator {
    	public Chocolate(Drink obj) {
    		super(obj);
    		setDes(" 巧克力 ");
    		setPrice(3.0f); // 调味品 的价格
    	}
    }
    public class Milk extends Decorator {
    	public Milk(Drink obj) {
    		super(obj);
    		setDes(" 牛奶 ");
    		setPrice(2.0f); 
    	}
    }
    
  • 相关阅读:
    限制容器对CPU的使用
    限制容器对内存的使用
    一张图搞懂容器所有操作
    TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)
    pr_debug、dev_dbg等动态调试三
    pr_debug、dev_dbg等动态调试二
    TQ2440平台上LCD驱动的移植
    Android如何通过shareduserid获取系统权限
    基于Android的串口聊天室 (基于tiny4412) 一
    Java中的泛型方法
  • 原文地址:https://www.cnblogs.com/chao-zjj/p/11300518.html
Copyright © 2011-2022 走看看