您的位置首页  日常用品  装饰

深入分析设计模式中的装饰模式(java代码实现)

  我们都去过奶茶店买过奶茶吧,一种奶茶可能有很多不同的产品,同一种产品也有很多不同的口味。我们去买的时候,都会发现我们的奶茶是现场调制的,奶茶店会根据已有的很多奶茶,添加不同的口味。再比如新买的房子去装修,房子是不会变的,但是我们可以装修成不同的风格。这一过程就是装饰过程。其思想就是装饰模式。这篇文章将通过案例对装饰模式有一个了解和分析。

  装饰模式又名包装模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。有透明和半透明两种,大部分都是半透明的,半透明的装饰模式是介于装饰模式和适配器模式之间的。

  从上面这张图我们可以看到,我们去店里买一杯奶茶有10种,还有6种口味可供选择,如果我们把不同的奶茶都当成一个类,那我们就需要new出来6*10个类。想想这样也太多了,使用了装饰器模式,使用18个类(10个类表示奶茶,6个类表示口味、其他两个分别是奶茶和口味的接口抽象)就能生产任何奶茶了,是不是很方便。

  透明的装饰模式,要求具体构件角色、装饰角色的接口与抽象构件角色的接口完全一致。意思是奶茶接口、珍珠奶茶和蜂蜜奶茶、调料的这些接口一样。下面代码中会有体现。相反,如果装饰角色的接口与抽象构件角色接口不一致,那就是半透明的了。

  (1)Component(抽象构建):这里指的奶茶抽象接口,表示规范准备接收附加责任的对象。

  (2)ConcreteComponent(具体构建):这里指珍珠奶茶、蜂蜜奶茶等具体的奶茶。

  (4)ConcreteDecorator(具体装饰器):具体不同的口味,给奶茶一些附加的特色。

  装饰器动态地给一个对象添加一些额外的功能。相比起继承子类来说,他的功能更加的灵活。不改变接口的前提下,增强所考虑的类的性能。

  现在我们基本上对装饰模式有了基本的了解了,不过这还不够,在文中一开始我们提到过,上面的只是对透明类型的装饰模式进行了介绍,下面就来看看什么是半透明的。

  半透明装饰模式可以给系统带来更多的灵活性,设计相对简单,使用起来也非常方便;但是其最大的缺点在于不能实现对同一个对象的多次装饰,而且客户端需要有区别地对待装饰之前的对象和装饰之后的对象。那它是怎么实现的呢?我们来看看透明装饰模式和半透明装饰模式的区别。

  我们开的车可以定义为一个抽象构建,其具体构件可以有小轿车、越野车、跑车等等,他们都具有在马路上行驶的能力,但是突然出现了一种车,不仅能在地上跑了,也能在天上飞了,这时候我们就需要在我们的装饰器里面新增一个fly方法,过了没多久我们发现又出现了一种车更牛,不仅能在地上跑,还能在水里游了,这时候我们有需要在我们的装饰器里面新增一个swim方法。这些fly和swim是车接口没有的方法,问题就在这。也就是说果装饰角色的接口(装饰器)与抽象构件角色接口(车接口)中的方法不一致。这就是透明装饰模式和半透明装饰模式的区别。

  适配器模式,一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

  装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。(增加新接口的装饰者模式可以认为是其变种--“半透明”装饰者)

  适配器模式则修饰非血缘关系类,把一个非本家族的对象伪装成本家族的对象,注意是伪装,因此它的本质还是非相同接口的对象。

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186