设计模式-装饰器模式(结构性模式之一)

一 介绍

  职责:动态的为一个对象增加新的功能。

  装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

二角色

  • Component为统一接口,也是装饰类和被装饰类的基本类型。
  • ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。
  • Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。
  • ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。

  思路:

  惯性思维来讲,我们增加对象的功能,会新增方法,或者继承父类然后在子类中新增方法。这中耦合度比价高。

   现在我们通过DI,把需要新增方法的对象-暂时称之为目标对象,依赖进入装饰器类中, 装饰类和此目标对象有共同的接口实现——这样就使得调用装饰器方法和目标对象的方法名一致。然后具体装饰器继承此装饰器

三 实现

 client :

  //使用装饰器
  Component component = new ConcreteDecorator(new ConcretComponent());
  component.biu();

四 应用举例

     宝马车,BMW3 BMW5 BMW7, 这些车的发动机,变速箱等等不同,假如它们喷漆是相同的,而且有多种颜色,我们如果给每种车系增加喷不同色的方法那太麻烦了。现在只需要给Icar 接口增加喷漆方法,每种车只知道需要喷漆,但是具体是什么颜色则由装饰器来实现

 统一接口  :

    Icar

    spraypaint();  // 喷漆方法


ConcreteComponent为具体实现类:

BMW3 implements Icar

BMW5 implements Icar

BMW7 implements Icar


 Decoretor 装饰

decorator implements Icar

 private Icar car;

构造方法注入Icar 类型属性

@override

 car.spraypaint();


ConcreteDecorator是具体的装饰产品类

RedCconcreteDecorator extends decorator

// 重写喷漆方法,并且增加新的功能,如红色,白色等

 

调用

  Icar car3 = new RedCconcreteDecorator (new BMW3());  

  car3.spraypaint();  // 给宝马三喷色红漆

  Icar ca5r = new RedCconcreteDecorator (new BMW5());  

   car5.spraypaint();  // 给宝马五喷色红漆

  

 这样就不需要为每个系列的车都增加喷射红漆的方法啦....

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值