1. 程式人生 > >走進設計模式的世界7:我們很像但不是一個人好嗎?-介面卡模式和外觀模式

走進設計模式的世界7:我們很像但不是一個人好嗎?-介面卡模式和外觀模式

介面卡模式:

將一個類的介面,轉接成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。

外觀模式:

提供了一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。

設計原則:最少知識原則:只和你的密友談話。

解釋:當需要使用一個現有的類而其介面並不符合你的需要時,就使用介面卡

           當需要簡化並統一一個很大的介面或者一群複雜介面時,使用外觀

介面卡改變介面以符合客戶的期望。外觀將客戶從一個複雜的子系統中解耦。實現一個介面卡可能需要一番功夫,也可以不費功夫,視目標介面的大小和複雜度而定。實現一個外觀,需要將子系統組合進外觀中,然後將工作委託給子系統執行,介面卡模式有兩種形式:物件介面卡和類介面卡。類介面卡需要用到多繼承。(java不支援)你可以為一個子系統實現一個以上的外觀。介面卡將物件包裝起來以改變其介面;裝飾者將一個物件包裝起來增加新的行為和責任;外觀將一群物件包裝起來以簡化其介面。

介面卡模式樣例:我需要一個根能把我筆記本連線上電腦的線。

/**

    公司的老闆找到了mis,
    說我這有一臺顯示器我想讓我的筆記本
    接到這臺電腦上雙屏工作。
    於是,mis就有了這樣的設想

**/


public class Monitor{
    // 這是一條typec的連線線
    private HDMIConnector hdmi;
    
    public Monitor(HDMIConnector connector){
        if(connector==null){
            this.hdmi = new Hdmi();
        }else{
            this.hdmi = connector;
        }
    }

    // 連線方法
    public void connect(){
        // 用筆記本的hdmi線直接臉上電腦
        hdmi.connect();
    }
}


/**
    拿到了電腦的mis萬萬沒有想到,
    老闆的電腦比較高階,是隻有type-c介面的。
    所以他只能通過各種線去適配這臺顯示器了
**/

/**
    所以他找來了type-c轉hdmi轉接盒。
**/
// 把typec介面適配層hdmi介面
public class TypeCToHdmiAdapter implments HDMIConnector{
    private TYPECConnector  connector;

    public TypeCToHdmiAdapter(TYPECConnector connector){
        this.connector = connector;
    }
    
    // 實現介面方法
    public void connect(){
       //轉化成hdmi
       connector.toHdmi();    
       //連線顯示器
       connector.connectMonitor();
    }

}

mis成功的化解了尷尬,他將typec介面適配成了顯示器需要用的hdmi,老闆的顯示器和老闆也明顯的不關心到底是怎麼連的只知道我可以連線就可以了這就是介面卡模式的本質。

外觀模式樣例:煲湯太麻煩了!!!!

/**
    媳婦心血來潮要給我煲湯
    於是乎我就教了一下她。
**/

public class BaoTang(){
    // 忽略各個實體類,知道就行。 
    // 工具
    private GongJu gongju;
    // 鍋具
    private Guo guo;
    // 火
    private Huo huo;
    
    public static void mian(String[]agrs){
        // 開大火
        huo.kaidahuo();
        // 蓋上鍋蓋
        guo.gaishangguogai();
        // 開啟鍋蓋
        guo.dakaiguogai();
        // 去浮沫
        gongju.qufumo();
        // 開小火
        huo.kaixiaohuo();
        // 關火
        huo.guanhuo();
    }

}


/**
    媳婦聽的頭都大了,於是去超市買了個自動湯鍋
**/
public class HuBoEr(){
    // 忽波爾湯鍋有如下功能
    public void zhutang(){
        ...
        ...
    }
}

public class BaoTang(){
    
    public static void mian(String[]agrs){
        HuBoEr huboer = new HuBoEr();
        huboer.zhutang();
    }
}


這裡的胡泊爾湯鍋就是一個外觀模式很好的例子,別人只要呼叫一個方法就可以完成一些列的巨集操作。

簡化了介面。但是如果人們仍然想用原來的介面也並不耽誤使用。

總結:外觀不只是簡化了介面,也將客戶從元件的子系統中解耦。外觀和介面卡可以包裝許多類,但是外觀的意圖是簡化介面,而介面卡的意圖是將介面轉化成不同的介面。外觀可以封裝很多套,介面卡也可以有很多個,靈活而簡易。