《Android源碼設計模式》讀書筆記 (21) 第21章 裝飾模式

前言

  • 裝飾模式其實是繼承關係的一種替代方案之一,是一種對客戶端透明的方式來動態地擴展對象的功能.
  • 因爲近期入職了新公司,還是把設計模式都在溫習一遍.

正文

  • 定義:動態地給一個對象添加一些額外的職責.就增加功能來說,裝飾模式相比生成子類更爲靈活
  • 使用場景:需要透明且動態地擴展類的功能時
  • 和代理模式的區別:裝飾模式和代理模式有點類似.裝飾模式是以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案;而代理模式則是給一個對象提供一個代理對象,並有代理對象來控制原有對象的引用.裝飾模式應該爲所裝飾的對象增強功能;代理模式對代理的對象施加控制,但不對對象本身的功能進行增強.

UML類圖

這裏寫圖片描述

  • Component:抽象組件:可以事一個接口或抽象類,其充當的就是被裝飾的原始對象.
/**
 * 抽象組件類
 * Created by max on 2016/4/12.
 */
public abstract class Component {
    /**
     * 抽象的方法,同樣的也可以增加更多的抽象方法
     */
    public abstract void operate();
}
  • ConcreteComponent:組件具體實現類:該類是Component類的基本實現,也是我們裝飾的具體對象.
/**
 * 組件具體實現類
 * Created by max on 2016/4/12.
 */
public class ConcreteComponent extends Component{

    @Override
    public void operate() {
        //具體抽象類的實現邏輯
    }
}
  • Decorator:抽象裝飾者:其承擔的職責就是爲了裝飾我們的組件對象,其內部一定要有一個指向組件對象的引用.
/**
 * 抽象裝飾者
 * Created by max on 2016/4/12.
 */
public abstract class Decorator extends Component{
    private Component component;//持有一個Component對象的引用

    /**
     * 必要的構造方法,需要一個Component的引用
     * @param component
     */
    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operate() {
        component.operate();
    }
}
  • ConcreteDdecoratorA:裝飾者具體實現類
/**
 * 裝飾者具體實現類
 * Created by max on 2016/4/12.
 */
public class ConcreteDecoratorA extends Decorator{
    /**
     * 必要的構造方法,需要一個Component的引用
     *
     * @param component
     */
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    /**
     * 可以任意增加要想增加的功能來實現裝飾模式
     */
    @Override
    public void operate() {
        super.operate();
        operateA();
        operateB();
    }

    /**
     * 自定義的裝飾方法A
     */
    public void operateA(){
        //裝飾方法邏輯
    }

    /**
     * 自定義的裝飾方法B
     */
    public void operateB(){
        //裝飾方法邏輯
    }
}
  • Client:客戶端調用:
/**
 * 客戶端調用類
 * Created by max on 2016/4/12.
 */
public class Client {
    public static void main(String args[]){
        //構造被裝飾者的組件對象
        Component component = new ConcreteComponent();
        //根據組件對象構造裝飾者對象A並調用,此時相當於給組件對象增加裝飾者A的功能方法
        Decorator decorator = new ConcreteDecoratorA(component);
        decorator.operate();
    }
}

總結

發佈了82 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章