装饰者模式
来源:互联网 发布: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、装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型;
- 装饰者模式(Derector)
- 装饰者模式
- Decorator 装饰者模式
- 装饰者设计模式
- 装饰者模式
- 装饰者模式
- 装饰者模式
- 装饰者模式(Decorator)
- 装饰者模式
- 装饰者模式
- 装饰者模式
- 装饰者模式 DecoratorPattern
- 设计模式 - 装饰者
- 装饰者模式
- 装饰者模式
- 装饰者模式 - 2
- 装饰者模式
- 装饰者模式
- Android OpenCore 学习(1)
- S3C44b0 RTC调试经验
- Windows 线程漫谈——界面线程和工作者线程
- gdb调试
- 离线发布bolg----使用Windows live writer客户端来发布CSDN的博客文章
- 装饰者模式
- Spring的MVC配置详解
- 关于J2me手游fillrect和drawImage效率问题
- Microsoft - IIS访问aspx页面出现500内部错误
- [.NET] socket connect with timeout
- 运行jar应用程序引用其他jar包的四种方法
- 在Realview MDK 中如何生成*.bin 格式的文件
- windows下用命令行导入远程mysql数据库
- SecurityError: Error #2146: 安全沙箱冲突:http://xxx/xxx.swf 不能调用 navigateToURL,因为 HTML/容器参数 allowNetworking 具有值 internal