java装饰模式实例解析

1、装饰模式概述:

装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类更为灵活。《设计模式的艺术》

使用场景:

现实生活中大家都会遇到的一种场景,当买了房子之后,可能都需要对房子进行装修,或是根据自己的一些喜好对房间进行二次的装饰来满足自己的需求。软件系统开发也如此,一个系统设计好之后,常常需要对系统进行扩展,增加新的业务需求。市场端的需求是善变的,因此在软件设计时必须要考虑到系统的扩展性,不可能一次性将所有功能做到满足所有需求。装饰模式的应用,为系统的扩展以及迭代需求提供很好的支持。

2、装饰模式UML类图:

放眼望去,上面代码好像想比初始时一个类处理完所有功能要复杂的多,结构设计也更抽象化,或许让人觉得更加难理解。首先将折扣业务划分为2个类别,并且设计对应的实现者和装饰者,当业务反之需要对其中的折扣规则进行扩展或者是修改时,并不需要直接修改原有具体实现者的方法,只需要修改VIPDiscountDecorator和FestivalDiscountDecorator等装饰类中的处理逻辑或者是增加新的接口实现新的业务需求。换句话说不管业务怎么变化,基础的实现方式不会随者系统扩展而发生变化,不会破坏原有封装性。从扩展性和解耦性上来说,这样的设计会更符合面向对象设计原则,而且这种设计可读性更高。

4、透明装饰模式与半透明装饰模式

两者之间的区别并不大,透明与否是对客户端程序而言。上述的示例其实就是透明装饰模式,因为装饰类中的接口都定义在抽象类DiscountDecorator中,用户在使用时面向抽象,所有的接口都是透明的。半透明的就是将具体业务类的装饰方法定义在具体的装饰类中,在客户端使用装饰类时要直接用具体装饰类声明对象,只能使用其业务相关的方法。

5、优缺点分析:

优点:

1)灵活性更好,不用增加特别多子类对原有功能进行扩展;
2)降低系统耦合,面向接口编程,扩展性好;

缺点:

1)设计的理解上会更复杂;

结束语

相信大家对于装饰模式已有一个初步了解,经常在面试的时候会被问到装饰模式与代理模式的区别。装饰模式意义在于对原有系统业务功能的扩展或者是装饰,而代理模式常用在原有系统中增加一些与业务无关的操作,例如日志、验证等功能。

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览93761 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年5月4日
下一篇 2018年5月4日

相关推荐