设计模式之装饰模式
2015-12-06 13:51
573 查看
(各种设计模式的源代码在 https://github.com/mjnjust/Designmode.git ,使用utf8编码)
一、定义
动态的给一个对象添加一些额外的职责
二、实例
2.1 假如你是买电脑的销售人员,你在顾客交流的时候不可能只说说某某电脑显卡什么型号,内存多大,使用的材料是什么……
肯定还要说一些通俗易懂的,如果对方是学生爱玩游戏,你要告诉它这电脑玩游戏很好;如果人家是工作了的白领,你要告诉它
这电脑可以同时运行很多东西……
总之就是见人说人话见鬼说鬼话,那么怎么用代码实现这个过程呢?
分析一下,首先,电脑的本身的特性是不变的,也就是说内存啊、显卡啊什么都是要老老实实和顾客说的,但是其它的修饰就
因人而异了。
首先定义一个抽象的电脑类
测试代码:
运行结果:
一、定义
动态的给一个对象添加一些额外的职责
二、实例
2.1 假如你是买电脑的销售人员,你在顾客交流的时候不可能只说说某某电脑显卡什么型号,内存多大,使用的材料是什么……
肯定还要说一些通俗易懂的,如果对方是学生爱玩游戏,你要告诉它这电脑玩游戏很好;如果人家是工作了的白领,你要告诉它
这电脑可以同时运行很多东西……
总之就是见人说人话见鬼说鬼话,那么怎么用代码实现这个过程呢?
分析一下,首先,电脑的本身的特性是不变的,也就是说内存啊、显卡啊什么都是要老老实实和顾客说的,但是其它的修饰就
因人而异了。
首先定义一个抽象的电脑类
public abstract class Computer { public abstract void introduce() ; }
然后定义一个具体的电脑类
public class LenoveComputer extends Computer { @Override public void introduce() { System.out.println("显卡型号:XX 内存大小:8G 显存大小:6G ......"); } }
定义一个基础的装饰类,因为我们要装饰的是电脑,所以我们的装饰类很自然的就需要继承Computer
public class Decorate extends Computer { private Computer computer ; public Decorate(Computer computer) { this.computer = computer ; } @Override public void introduce() { this.computer.introduce(); } }
实现真正的装饰类
public class RealDecorate1 extends Decorate { public RealDecorate1(Computer computer) { super(computer); } public void decorate() { System.out.println("这显卡,玩lol完全没问题!"); } @Override public void introduce(){ super.introduce(); this.decorate(); } } public class RealDecorate2 extends Decorate { public RealDecorate2(Computer computer) { super(computer); } public void decorate() { System.out.println("这内存,可以同时开很多很多东西而不卡啊!"); } @Override public void introduce(){ super.introduce(); this.decorate(); } }
测试代码:
Computer computer = new LenoveComputer(); computer = new RealDecorate1(computer); computer = new RealDecorate2(computer); computer.introduce();
运行结果:
显卡型号:XX 内存大小:8G 显存大小:6G ...... 这显卡,玩lol完全没问题! 这内存,可以同时开很多很多东西而不卡啊!
2.2 说明 这几个类看起来有点奇怪,尤其是看了测试代码以后,更加奇怪。我们要明白的是不管Decorate还是RealDecorate,他们都是Computer类继承而来,他们都是Computer类。 computer = new RealDecorate1(computer),这句话首先给computer 套上了第一层RealDecorate1的封装, computer = new RealDecorate2(computer)又给computer套上了第二层封装, 最终computer指向的如下图所示(结合代码理解):
执行computer.introduce()函数的时候,首先执行RealDecorate2.introduce(),然后根据这个函数里面的调用关系往下运行。 2.3 装饰模式的好处: 在某种程度上可以代替创建子类,而且可以装饰很多很多层。
相关文章推荐
- Git常用命令
- Logstash日志搜集
- 预装64位Win8/8.1电脑安装64位Win7详细过程(单/双系统)
- 信息安全系统设计基础第十三周总结
- muduo总结
- hdu 5591 BestCoder Round #65(博弈)
- hdu 5591 BestCoder Round #65(博弈)
- 使用Ant实现多渠道,多环境打包apk
- UEFI+GPT引导实践篇(二):UEFI引导安装64位Win7/Win8
- 多线程编程模型
- 约瑟夫环问题
- Java的完整表述是什么
- window server 2008 R2 下oracle安装过程出现问题总结:
- Stl——Vector.erase()用法
- 快速排序
- 微信登录的openid和unionid区别
- 在线考试系统之随机抽取试题
- css hack 与案例
- ZeroC Ice启用SSL通讯的配置
- stm32串口间通信