设计模式(10)-装饰模式详解(易懂)

装饰模式的定义

装饰模式指的是在没必要改变原类文件和使用继承的状况下,动态地扩展一个对象的功能。它是经过建立一个包装对象,也就是装饰来包裹真实的对象。编程

模型:微信

image

  • Component:抽象组件,是一个接口或者抽象类;就是定义的最原始的对象
  • ConcreteComponent:具体组件,实现类(须要装饰)
  • Decorator:装饰角色,通常是抽象类,实现接口;它的属性必然有个private变量指向Conponent抽象组件
  • ConcreteDecorator:具体的装饰对象

实例说明

举个例子:好比一个正在上高中的学生“小明”在考完试后,和父母说想买一款5000元的手机。架构

1.Component,抽象方法-买手机ide

public abstract class AbstractBuyPhone {
   //主要是向父母提出想买手机的意向
   public  abstract  void  BuyPhone();
  //父母是否赞成
   public  abstract  void   Agree();
}

2.ConcreteComponent:具体的意向this

public class XiaoMingBuyPhone extends  AbstractBuyPhone {
   @Override
   public void BuyPhone() {
       Log.d("qzs","我想买一款华为的5000元的手机");
   }

   @Override
   public void Agree() {
       Log.d("qzs","父母赞成了");
   }
}

3.Decorator,增长一个装饰抽象类,方便修饰spa

public class AbstractDecorator extends AbstractBuyPhone {
   private  AbstractBuyPhone abstractBuyPhone;

   public  AbstractDecorator ( AbstractBuyPhone abstractBuyPhone){
       this.abstractBuyPhone=abstractBuyPhone;
   }

   @Override
   public void BuyPhone() {
     this.abstractBuyPhone.BuyPhone();
   }

   @Override
   public void Agree() {
       this.abstractBuyPhone.Agree();
   }
}

4.ConcreteDecorator:若是直接去找父母要手机,很容易被拒绝,因此须要修饰一下,这里用成绩修饰一下设计

public class ScoreDecortator extends AbstractDecorator {

   public ScoreDecortator(AbstractBuyPhone abstractBuyPhone) {
       super(abstractBuyPhone);
   }

   //先和父母说说本身的成绩
   private  void  ShowScore(){
       Log.d("qzs","我此次考试的成绩年级前三,又进步了");
   }
  //重写买手机的方法,先汇报成绩,而后再提买手机的事情
   @Override
   public void BuyPhone() {
       this.ShowScore();
       super.BuyPhone();
   }
}

5.调用,也就是请求父母:code

AbstractBuyPhone str;
       //小明的本来意向
        str=new XiaoMingBuyPhone();
        //修饰后的意向
        str=new ScoreDecortator(str);
        //向父母提出想法(成绩和买手机)
        str.BuyPhone();
        //父母赞成了
        str.Agree();

运行结果:对象

image

强调:这里只加了分数的修饰,能够加多个修饰类来知足你最后的目的继承

装饰模式的优缺点及其余

1.优势

  • Decorator模式与继承关系的目的都是要扩展对象的功能,可是Decorator能够提供比继承更多的灵活性。
  • 经过使用不一样的具体装饰类以及这些装饰类的排列组合,设计师能够创造出不少不一样行为的组合。

2.缺点

  • 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
  • 装饰模式会致使设计中出现许多小类,若是过分使用,会使程序变得很复杂。
  • 装饰模式是针对抽象组件(Component)类型编程。可是,若是你要针对具体组件编程时,就应该从新思考你的应用架构,以及装饰者是否合适。固然也能够改变Component接口,增长新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要作出最佳选择。

3.适用场景

  • 须要扩展一个类的功能,或给一个类添加附加职责。
  • 须要动态的给一个对象添加功能,这些功能能够再动态的撤销。

定义和优缺点来自网上百度信息


另外能够加入个人Android技术交流群:458739310
你们能够关注个人微信公众号:「安卓干货铺」一个有质量、有态度的公众号!

相关文章
相关标签/搜索