【编程素质】设计模式-装饰模式:处于安全目的,保护被访问者
2016-10-19 22:54
405 查看
1,什么是装饰模式(Decorator)
(1)概念:
是动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。又名包装(Wrapper)模式。
是以对客户端透明的方式扩展对象的功能,换句话说,客户端不会察觉到装饰前与装饰后有什么不同。
在不修改底层代码情况下,给对象赋予新的职责。
(2)场景:
I/O、过滤器。(3)注意
①装饰者和被装饰对象有相同的超类型。因为装饰者必须能取代被装饰者。
②可以有多个装饰者。
③装饰模式输出的过程就像拆包,拆开每一个装饰者内容。
(4)优缺点
优:让算法的变化独立于使用算法的客户。
缺:
造成设计中有大量的小类。
装饰者在实例化组件时,将增加代码复杂度。(不只需要实例化组件,还要把此组件包装进装饰者中)。
2,经典用例:
java.io类:
例子:用BufferedReader修饰InputStreamReader对象:BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
3,demo
由4部分组成:抽象接口,具体组件(要接收附加责任的类),抽象装饰者,具体装饰者(给接口对象添加附加责任):package decorator; public class Main { public static void main(String args[]){ Beverage beverage = new Espresso(); System.out.println("订一杯Espresso,不要调料"); System.out.println(beverage.getDescription() + "$" + beverage.cost()); System.out.println("-------------"); System.out.println("订一杯HouseBlend"); Beverage beverage2 = new HouseBlend(); System.out.println("加调料:Mocha装饰它"); beverage2 = new Mocha(beverage2); System.out.println("加调料:Mocha装饰它"); beverage2 = new Mocha(beverage2); System.out.println("加调料:Whip装饰它"); beverage2 = new Whip(beverage2); System.out.println(beverage2.getDescription() + "$" + beverage2.cost()); } }
package decorator; /** * 抽象组件 * 饮料超类:接口(也可以用抽象类替代) * @author luo * */ public interface Beverage { public double cost(); public String getDescription(); }
package decorator; /** * 抽象装饰者 * 调料类:抽象类 * @author luo * */ public abstract class CondimentDeccorator implements Beverage{ @Override public abstract String getDescription(); }
package decorator; /** * 具体组件 * 浓缩咖啡类 * * @author luo * */ public class Espresso implements Beverage { private String description = "Espresso"; private double price = 1.2; @Override public double cost() { System.out.println("Espresso价格,1.2"); return price; } @Override public String getDescription() { return description; } }
package decorator; /** * 具体组件 * 一种饮料 * @author luo * */ public class HouseBlend implements Beverage { private String description = "HouseBlend Coffee"; private double price = 1.5; @Override public double cost() { System.out.println("HouseBlend价格,1.5"); return price; } @Override public String getDescription() { return description; } }
package decorator; /** * 摩卡类 */ public class Mocha extends CondimentDeccorator{ Beverage beverage; public Mocha(Beverage beverage){ this.beverage = beverage; } @Override public double cost() { System.out.println("Mocha调料,0.2"); return .20 + beverage.cost(); } @Override public String getDescription() { return beverage.getDescription() + ", Mocha"; } }
package decorator; public class Whip extends CondimentDeccorator{ Beverage beverage; public Whip(Beverage beverage){ this.beverage = beverage; } @Override public double cost() { System.out.println("Whip调料,0.2"); return .20 + beverage.cost(); } @Override public String getDescription() { return beverage.getDescription() + ", Whip"; } }
相关文章推荐
- js原生设计模式——4安全的工厂方法模式之oop编程增强版
- 详解C++设计模式编程中对访问者模式的运用
- 【编程素质】设计模式-单例模式(Singleton pattern)
- 举例讲解Python设计模式编程中的访问者与观察者模式
- 【编程素质】多线程编程之设计模式
- Android编程设计模式之访问者模式详解
- 【编程素质】设计模式-桥接模式
- 详解Java设计模式编程中的访问者模式
- 【编程素质】设计模式-外观模式
- 【编程素质】设计模式-策略模式
- Object-C编程之道 iOS设计模式解析--访问者模式
- 编程常用设计模式详解--(中篇)(适配器、装饰、代理、外观、桥接、组合、享元)
- 编程经常使用设计模式具体解释--(中篇)(适配器、装饰、代理、外观、桥接、组合、享元)
- 【编程素质】设计模式-命令模式
- 设计模式:行为扩展(访问者,装饰,责任链)
- 【编程素质】设计模式-其它
- 【编程素质】设计模式-代理模式(委托模式、Proxy Pattern):动态扩充对象功能
- 【编程素质】设计模式-工厂模式:工厂方法、简单工厂、抽象工厂
- 【编程素质】设计模式-观察者模式
- 举例讲解Python设计模式编程中的访问者与观察者模式