設計模式(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
你們能夠關注個人微信公衆號:「安卓乾貨鋪」一個有質量、有態度的公衆號!

相關文章
相關標籤/搜索