装饰者模式

来源:互联网 发布:centos7编译安装nginx 编辑:程序博客网 时间:2024/05/16 06:33

星巴兹咖啡

      星巴兹咖啡里面提供

      咖啡:  综合、深焙、低咖啡因、浓缩

      配料:  牛奶、摩卡、豆浆、奶泡

可以一种咖啡里面加不同分量、种类的配料

 

原先的设计方法是:每一种咖啡带不同的配料设计成继承超类饮料的一个类,这样会造成类的爆炸及设计死板。

 

 

有人提出了第二种方法:

但这种方法仍存在设计缺陷:

 

 

 

开放-关闭原则虽然不错,但很难让设计的每个部分都遵循开放-关闭原则,因为非常耗费时间和努力,而且遵循开放-关闭原则,通常会引入新的抽象层次,增加代码的复杂度。应该做的是:将注意力集中在设计中最有可能改变的地方,然后应用开放-关闭原则。

 

 

装饰者模式:

 

装饰者模式例子如下图所示:首先选定最内层的对象(某种咖啡),然后以包裹的形式层层包装(装饰)。

 

从这个例子可以得到装饰者模式的一些要求:

 

 

 

装饰者模式的定义如下:

 

 

 

装饰者模式下的类图及使用举例

 

 

 

 

public class StarbuzzCoffee {

 

public static void main(String args[]) {

Beverage beverage = new Espresso();

System.out.println(beverage.getDescription() 

+ " $" + beverage.cost());

 

Beverage beverage2 = new DarkRoast();

beverage2 = new Mocha(beverage2);

beverage2 = new Mocha(beverage2);

beverage2 = new Whip(beverage2);

System.out.println(beverage2.getDescription() 

+ " $" + beverage2.cost());

 

Beverage beverage3 = new HouseBlend();

beverage3 = new Soy(beverage3);

beverage3 = new Mocha(beverage3);

beverage3 = new Whip(beverage3);

System.out.println(beverage3.getDescription() 

+ " $" + beverage3.cost());

}

}

 

 

Java中真实的装饰者例子

 

 

 

但装饰者模式也存在一些缺点:

 

      1、设计中会存在大量的小类;

      2、可透明的加入装饰者,但由于某些客户代码依赖特殊的类型,而这样的代码一导入装饰者类型就会导致问题。

 

建议参考工厂模式或生成器模式

      3、装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型;

原创粉丝点击