3 結(jié)構(gòu)型模式概述(結(jié)構(gòu)型模式的分類)

3.1 結(jié)構(gòu)型模式基本概念

結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)畸裳。它分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式怖糊,前者采用繼承機制來組織接口和類蓬抄,后者釆用組合或聚合來組合對象嚷缭。
由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低路幸,滿足“合成復(fù)用原則”,所以對象結(jié)構(gòu)型模式比類結(jié)構(gòu)型模式具有更大的靈活性砰识。
結(jié)構(gòu)型模式分為以下 7 種:
代理(Proxy)模式:為某對象提供一種代理以控制對該對象的訪問。即客戶端通過代理間接地訪問該對象膨处,從而限制鹃答、增強或修改該對象的一些特性测摔。
適配器(Adapter)模式:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
橋接(Bridge)模式:將抽象與實現(xiàn)分離樊销,使它們可以獨立變化。它是用組合關(guān)系代替繼承關(guān)系來實現(xiàn)的,從而降低了抽象和實現(xiàn)這兩個可變維度的耦合度腺占。
裝飾(Decorator)模式:動態(tài)地給對象增加一些職責(zé)积蔚,即增加其額外的功能尽爆。
外觀(Facade)模式:為多個復(fù)雜的子系統(tǒng)提供一個一致的接口槐雾,使這些子系統(tǒng)更加容易被訪問彪笼。
享元(Flyweight)模式:運用共享技術(shù)來有效地支持大量細(xì)粒度對象的復(fù)用幅恋。
組合(Composite)模式:將對象組合成樹狀層次結(jié)構(gòu),使用戶對單個對象和組合對象具有一致的訪問性。

3.2 代理模式

代理模式的定義:由于某些原因需要給某對象提供一個代理以控制對該對象的訪問。這時,訪問對象不適合或者不能直接引用目標(biāo)對象,代理對象作為訪問對象和目標(biāo)對象之間的中介挨厚。
代理模式的結(jié)構(gòu)比較簡單寞钥,主要是通過定義一個繼承抽象主題的代理來包含真實主題,從而實現(xiàn)對真實主題的訪問赚爵,下面來分析其基本結(jié)構(gòu)和實現(xiàn)方法法瑟。
代理模式的主要角色如下:
抽象主題(Subject)類:通過接口或抽象類聲明真實主題和代理對象實現(xiàn)的業(yè)務(wù)方法。
真實主題(Real Subject)類:實現(xiàn)了抽象主題中的具體業(yè)務(wù)唁奢,是代理對象所代表的真實對象霎挟,是最終要引用的對象。
代理(Proxy)類:提供了與真實主題相同的接口麻掸,其內(nèi)部含有對真實主題的引用酥夭,它可以訪問、控制或擴展真實主題的功能脊奋。


image

一般代理會被理解為代碼增強熬北,實際上就是在原代碼邏輯前后增加一些代碼邏輯,而使調(diào)用者無感知诚隙。

根據(jù)代理的創(chuàng)建時期讶隐,代理模式分為靜態(tài)代理和動態(tài)代理。
靜態(tài):由程序員創(chuàng)建代理類或特定工具自動生成源代碼再對其編譯最楷,在程序運行前代理類的 .class 文件就已經(jīng)存在了整份。
動態(tài):在程序運行時,運用反射機制動態(tài)創(chuàng)建而成.
代碼:

package proxy;

public class ProxyTest {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.Request();
    }
}

//抽象主題
interface Subject {
    void Request();
}

//真實主題
class RealSubject implements Subject {
    public void Request() {
        System.out.println("訪問真實主題方法...");
    }
}

//代理
class Proxy implements Subject {
    private RealSubject realSubject;

    public void Request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.Request();
        postRequest();
    }

    public void preRequest() {
        System.out.println("訪問真實主題之前的預(yù)處理籽孙。");
    }

    public void postRequest() {
        System.out.println("訪問真實主題之后的后續(xù)處理烈评。");
    }
}

3.3 適配器模式(Adapter模式)

適配器模式(Adapter)的定義如下:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作犯建。適配器模式分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式兩種讲冠,前者類之間的耦合度比后者高,且要求程序員了解現(xiàn)有組件庫中的相關(guān)組件的內(nèi)部結(jié)構(gòu)适瓦,所以應(yīng)用相對較少些竿开。
類適配器模式可采用多重繼承方式實現(xiàn),如 C++ 可定義一個適配器類來同時繼承當(dāng)前系統(tǒng)的業(yè)務(wù)接口和現(xiàn)有組件庫中已經(jīng)存在的組件接口玻熙;[Java] 不支持多繼承否彩,但可以定義一個適配器類來實現(xiàn)當(dāng)前系統(tǒng)的業(yè)務(wù)接口,同時又繼承現(xiàn)有組件庫中已經(jīng)存在的組件嗦随。
對象適配器模式可釆用將現(xiàn)有組件庫中已經(jīng)實現(xiàn)的組件引入適配器類中列荔,該類同時實現(xiàn)當(dāng)前系統(tǒng)的業(yè)務(wù)接口。
適配器模式(Adapter)包含以下主要角色:
目標(biāo)(Target)接口:當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口枚尼,它可以是抽象類或接口贴浙。
適配者(Adaptee)類:它是被訪問和適配的現(xiàn)存組件庫中的組件接口。
適配器(Adapter)類:它是一個轉(zhuǎn)換器署恍,通過繼承或引用適配者的對象崎溃,把適配者接口轉(zhuǎn)換成目標(biāo)接口,讓客戶按目標(biāo)接口的格式訪問適配者盯质。
類適配器模式的結(jié)構(gòu)圖

image

對象適配器模式的結(jié)構(gòu)圖
image

類適配器模式的代碼:

package adapter;
//目標(biāo)接口
interface Target
{
    public void request();
}
//適配者接口
class Adaptee
{
    public void specificRequest()
    {       
        System.out.println("適配者中的業(yè)務(wù)代碼被調(diào)用袁串!");
    }
}
//類適配器類
class ClassAdapter extends Adaptee implements Target
{
    public void request()
    {
        specificRequest();
    }
}
//客戶端代碼
public class ClassAdapterTest
{
    public static void main(String[] args)
    {
        System.out.println("類適配器模式測試:");
        Target target = new ClassAdapter();
        target.request();
    }
}

對象適配器模式的代碼:

package adapter;
//對象適配器類
class ObjectAdapter implements Target
{
    private Adaptee adaptee;
    public ObjectAdapter(Adaptee adaptee)
    {
        this.adaptee=adaptee;
    }
    public void request()
    {
        adaptee.specificRequest();
    }
}
//客戶端代碼
public class ObjectAdapterTest
{
    public static void main(String[] args)
    {
        System.out.println("對象適配器模式測試:");
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee);
        target.request();
    }
}

對象適配器模式中的“目標(biāo)接口”和“適配者類”的代碼同類適配器模式一樣概而,只要修改適配器類和客戶端的代碼即可.

3.4 橋接模式(Bridge模式)

橋接(Bridge)模式的定義如下:將抽象與實現(xiàn)分離,使它們可以獨立變化囱修。它是用組合關(guān)系代替繼承關(guān)系來實現(xiàn)到腥,從而降低了抽象和實現(xiàn)這兩個可變維度的耦合度。
橋接模式遵循了里氏替換原則和依賴倒置原則蔚袍,最終實現(xiàn)了開閉原則,對修改關(guān)閉配名,對擴展開放啤咽。
橋接模式將抽象化部分與實現(xiàn)化部分分開,取消二者的繼承關(guān)系渠脉,改用組合關(guān)系宇整;
模式的結(jié)構(gòu)
橋接(Bridge)模式包含以下主要角色。
抽象化(Abstraction)角色:定義抽象類芋膘,并包含一個對實現(xiàn)化對象的引用鳞青。
擴展抽象化(Refined Abstraction)角色:是抽象化角色的子類,實現(xiàn)父類中的業(yè)務(wù)方法为朋,并通過組合關(guān)系調(diào)用實現(xiàn)化角色中的業(yè)務(wù)方法臂拓。
實現(xiàn)化(Implementor)角色:定義實現(xiàn)化角色的接口,供擴展抽象化角色調(diào)用习寸。
具體實現(xiàn)化(Concrete Implementor)角色:給出實現(xiàn)化角色接口的具體實現(xiàn)胶惰。


image

代碼:

package bridge;

public class BridgeTest {
    public static void main(String[] args) {
        Implementor imple = new ConcreteImplementorA();
        Abstraction abs = new RefinedAbstraction(imple);
        abs.Operation();
    }
}

//實現(xiàn)化角色
interface Implementor {
    public void OperationImpl();
}

//具體實現(xiàn)化角色
class ConcreteImplementorA implements Implementor {
    public void OperationImpl() {
        System.out.println("具體實現(xiàn)化(Concrete Implementor)角色被訪問");
    }
}

//抽象化角色
abstract class Abstraction {
    protected Implementor imple;

    protected Abstraction(Implementor imple) {
        this.imple = imple;
    }

    public abstract void Operation();
}

//擴展抽象化角色
class RefinedAbstraction extends Abstraction {
    protected RefinedAbstraction(Implementor imple) {
        super(imple);
    }

    public void Operation() {
        System.out.println("擴展抽象化(Refined Abstraction)角色被訪問");
        imple.OperationImpl();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霞溪,隨后出現(xiàn)的幾起案子孵滞,更是在濱河造成了極大的恐慌,老刑警劉巖鸯匹,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坊饶,死亡現(xiàn)場離奇詭異,居然都是意外死亡殴蓬,警方通過查閱死者的電腦和手機匿级,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來科雳,“玉大人根蟹,你說我怎么就攤上這事≡忝兀” “怎么了简逮?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尿赚。 經(jīng)常有香客問我散庶,道長蕉堰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任悲龟,我火速辦了婚禮屋讶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘须教。我一直安慰自己皿渗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布轻腺。 她就那樣靜靜地躺著乐疆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贬养。 梳的紋絲不亂的頭發(fā)上挤土,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音误算,去河邊找鬼仰美。 笑死,一個胖子當(dāng)著我的面吹牛儿礼,可吹牛的內(nèi)容都是我干的咖杂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚊夫,長吁一口氣:“原來是場噩夢啊……” “哼翰苫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起这橙,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奏窑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屈扎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埃唯,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年鹰晨,在試婚紗的時候發(fā)現(xiàn)自己被綠了墨叛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡模蜡,死狀恐怖漠趁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忍疾,我是刑警寧澤闯传,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站卤妒,受9級特大地震影響甥绿,放射性物質(zhì)發(fā)生泄漏字币。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一共缕、第九天 我趴在偏房一處隱蔽的房頂上張望洗出。 院中可真熱鬧,春花似錦图谷、人聲如沸翩活。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隅茎。三九已至,卻和暖如春嫉沽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俏竞。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工绸硕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魂毁。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓玻佩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親席楚。 傳聞我的和親對象是個殘疾皇子咬崔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)。它分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式烦秩,前者采用繼承機制來組織接...
    Zal哥哥閱讀 231評論 0 0
  • 結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)垮斯。它分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式,前者采用繼承機制來組織接...
    迷心迷閱讀 573評論 0 0
  • 寫在前面 軟件設(shè)計七大原則開閉原則里氏替換原則依賴倒置原則單一職責(zé)原則接口隔離原則迪米特法則合成復(fù)用原則 創(chuàng)建型模...
    mtry閱讀 250評論 0 0
  • 3只祠、設(shè)計模式之結(jié)構(gòu)型模式 3.1 代理(Proxy)模式 3.1.1 引入案例: 前陣子疫情期間兜蠕,為了打發(fā)時間竟然...
    苦難_69e0閱讀 760評論 0 3
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭抛寝,有人歡樂有人憂愁熊杨,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53