天天看點

設計模式(結構型)之外觀模式(Facade Pattern)

PS一句:最終還是選擇CSDN來整理發表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown文法了,牛逼啊!

【工匠若水 http://blog.csdn.net/yanbober】 閱讀前一篇《設計模式(結構型)之裝飾者模式(Decorator Pattern)》http://blog.csdn.net/yanbober/article/details/45395747

概述

一個客戶類需要和多個業務類互動,而這些業務類經常會作為整體出現,由于涉及到的類比較多,導緻使用時代碼較為複雜。外觀模式通過引入一個新的外觀類(Facade)來實作該功能,外觀類為多個業務類的調用提供統一入口,簡化了類與類之間的互動。如果沒有外觀類,那麼每個客戶類需要和多個業務類之間進行複雜的互動,系統的耦合度将很大。外觀模式是迪米特法則的一種具體實作,通過引入一個新的外觀角色可以降低原有系統的複雜度,同時降低客戶類與子系統的耦合度。

設計模式(結構型)之外觀模式(Facade Pattern)

核心

概念: 為子系統中的一組接口提供一個統一的入口。外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

重點: 外觀模式結構重要核心子產品:

外觀角色

用戶端可以調用它的方法,在外觀角色中可以知道相關子系統的功能和責任;在正常情況下,它将所有從用戶端發來的請求委派到相應的子系統去,傳遞給相應的子系統對象處理。

子系統角色

在軟體系統中可以有一個或者多個子系統角色,每一個子系統可以不是一個單獨的類,而是一個類的集合,它實作子系統的功能;每一個子系統都可以被用戶端直接調用,或者被外觀角色調用,它處理由外觀類傳過來的請求;子系統并不知道外觀的存在,對于子系統而言,外觀角色僅僅是另外一個用戶端而已。

使用場景

需要通路一系列複雜的子系統時提供一個簡單入口。

用戶端程式與多個子系統之間存在很大的依賴性。引入外觀類可以将子系統與用戶端解耦,進而提高子系統的獨立性和可移植性。

在階層化結構中,可以使用外觀模式定義系統中每一層的入口,層與層之間不直接産生聯系,而通過外觀類建立聯系,降低層之間的耦合度。

程式猿執行個體

這裡還是以苦逼的程式猿為例來說明外觀模式。一個Android開發者開發Android程式需要很多工具條件,電腦,軟體,網絡。如下實作:

package yanbober.github.io;
//子系統角色
class Computer {
    public void thinkpad() {
        System.out.println("Computer is ThinkPad!");
    }
}

class EathNet {
    public void net() {
        System.out.println("Net is CMCC!");
    }
}

class DeveloperTools {
    public void tools() {
        System.out.println("Developer Tool is Android Studio!");
    }
}
//外觀角色
class AndroidDeveloperEquipment {
    public void equipment() {
        new Computer().thinkpad();
        new EathNet().net();
        new DeveloperTools().tools();
    }
}

public class Main {
    public static void main(String[] args) {
        AndroidDeveloperEquipment dev = new AndroidDeveloperEquipment();
        dev.equipment();
    }
}
           

總結一把

外觀模式優點:

  • 減少用戶端所需處理的對象數目,使得子系統使用起來更加容易。
  • 實作了子系統與用戶端之間的松耦合關系。
  • 一個子系統的修改對其他子系統沒有任何影響,而且子系統内部變化也不會影響到外觀對象。

外觀模式缺點:

  • 不能很好地限制用戶端直接使用子系統類,如果對用戶端通路子系統類做太多的限制則減少了可變性和靈活性。
  • 如果設計不當,增加新的子系統可能需要修改外觀類的源代碼,違背了開閉原則。

【工匠若水 http://blog.csdn.net/yanbober】 繼續閱讀《設計模式(結構型)之享元模式(Flyweight Pattern)》 http://blog.csdn.net/yanbober/article/details/45477551