国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

外觀模式(Facade Pattern) - 最易懂的設(shè)計(jì)模式解析

2019-11-09 17:50:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友


前言

今天我來(lái)全面總結(jié)一下Android開(kāi)發(fā)中最常用的設(shè)計(jì)模式 -外觀模式。

其他設(shè)計(jì)模式介紹 1分鐘全面了解“設(shè)計(jì)模式” 單例模式(Singleton) - 最易懂的設(shè)計(jì)模式解析 簡(jiǎn)單工廠模式(SimpleFactoryPattern)- 最易懂的設(shè)計(jì)模式解析 工廠方法模式(Factory Method)- 最易懂的設(shè)計(jì)模式解析 抽象工廠模式(Abstract Factory)- 最易懂的設(shè)計(jì)模式解析 策略模式(Strategy Pattern)- 最易懂的設(shè)計(jì)模式解析 適配器模式(Adapter Pattern)- 最易懂的設(shè)計(jì)模式解析 代理模式(PRoxy Pattern)- 最易懂的設(shè)計(jì)模式解析 模板方法模式(Template Method) - 最易懂的設(shè)計(jì)模式解析 建造者模式(Builder Pattern)- 最易懂的設(shè)計(jì)模式解析 外觀模式(Facade Pattern) - 最易懂的設(shè)計(jì)模式解析


目錄

外觀模式.jpg


1. 介紹

1.1 定義

定義了一個(gè)高層、統(tǒng)一的接口,外部與通過(guò)這個(gè)統(tǒng)一的接口對(duì)子系統(tǒng)中的一群接口進(jìn)行訪問(wèn)。

通過(guò)創(chuàng)建一個(gè)統(tǒng)一的類(lèi),用來(lái)包裝子系統(tǒng)中一個(gè)或多個(gè)復(fù)雜的類(lèi),客戶(hù)端可以通過(guò)調(diào)用外觀類(lèi)的方法來(lái)調(diào)用內(nèi)部子系統(tǒng)中所有方法

如下圖: 原理圖

給個(gè)網(wǎng)站的導(dǎo)航例子你就懂了:以前我需要在搜索欄逐個(gè)搜索網(wǎng)站地址;有了網(wǎng)站導(dǎo)航(用了外觀模式)后,就方便很多了 例子

1.2 主要作用

實(shí)現(xiàn)客戶(hù)類(lèi)與子系統(tǒng)類(lèi)的松耦合降低原有系統(tǒng)的復(fù)雜度提高了客戶(hù)端使用的便捷性,使得客戶(hù)端無(wú)須關(guān)心子系統(tǒng)的工作細(xì)節(jié),通過(guò)外觀角色即可調(diào)用相關(guān)功能。 引入外觀角色之后,用戶(hù)只需要與外觀角色交互; 用戶(hù)與子系統(tǒng)之間的復(fù)雜邏輯關(guān)系由外觀角色來(lái)實(shí)現(xiàn)

1.3 解決的問(wèn)題

避免了系統(tǒng)與系統(tǒng)之間的高耦合度使得復(fù)雜的子系統(tǒng)用法變得簡(jiǎn)單

2. 模式原理

2.1 UML類(lèi)圖 & 組成

UML類(lèi)圖

2.2 實(shí)例講解

接下來(lái)我用一個(gè)實(shí)例來(lái)對(duì)建造者模式進(jìn)行更深一步的介紹。 a. 實(shí)例概況

背景:小成的爺爺已經(jīng)80歲了,一個(gè)人在家生活:每次都需要打開(kāi)燈、打開(kāi)電視、打開(kāi)空調(diào);睡覺(jué)時(shí)關(guān)閉燈、關(guān)閉電視、關(guān)閉空調(diào);沖突:行動(dòng)不方便,走過(guò)去關(guān)閉那么多電器很麻煩,代碼如下:

1. 電器類(lèi):

//燈類(lèi)public class SubSystemA_Light { public void on(){ System.out.println("打開(kāi)了燈...."); } public void off(){ System.out.println("關(guān)閉了燈...."); } } //電視類(lèi)public class SubSystemB_Television { public void on(){ System.out.println("打開(kāi)了電視...."); } public void off(){ System.out.println("關(guān)閉了電視...."); } } //空調(diào)類(lèi)public class SubSystemC_Aircondition { public void on(){ System.out.println("打開(kāi)了電視...."); } public void off(){ System.out.println("關(guān)閉了電視...."); } }

2. 客戶(hù)端調(diào)用:小成爺爺使用電器情況

public class Facade Pattern{ public static void main(String[] args){ { SubSystemA_Light light = new SubSystemA_Light(); SubSystemB_Television television = new SubSystemB_Television(); SubSystemC_Aircondition aircondition = new SubSystemC_Aircondition(); //起床后開(kāi)電器 System.out.prinln("起床了"); light.on(); television.on(); aircondition.on(); System.out.prinln("可以看電視了"); //睡覺(jué)時(shí)關(guān)電器 System.out.prinln("睡覺(jué)了"); light.off(); television.off(); aircondition.off(); System.out.prinln("可以睡覺(jué)了"); } }

結(jié)果

起床了打開(kāi)了燈打開(kāi)了電視打開(kāi)了空調(diào)可以看電視了睡覺(jué)了關(guān)閉了燈關(guān)閉了電視關(guān)閉了空調(diào)可以睡覺(jué)了

從上面可以看出,在不使用外觀模式的情況下,小成爺爺需要對(duì)每個(gè)電器都進(jìn)行操作,非常不方便

客戶(hù)端與三個(gè)子系統(tǒng)都發(fā)送了耦合,使得客戶(hù)端程序依賴(lài)與子系統(tǒng)

解決方案

小成買(mǎi)了一個(gè)智能家具控制器(外觀對(duì)象/統(tǒng)一接口)給他爺爺,他爺爺只需要一鍵就能打開(kāi)/關(guān)閉 燈、電視機(jī)、空調(diào)

即用外觀模式來(lái)為所有子系統(tǒng)設(shè)計(jì)一個(gè)統(tǒng)一的接口 客戶(hù)端只需要調(diào)用外觀類(lèi)中的方法就可以了,簡(jiǎn)化了客戶(hù)端的操作

1. 電器類(lèi)同上

2. 外觀類(lèi):智能遙控器

public class Facade{ SubSystemA_Light light; SubSystemB_Television television ; SubSystemC_Aircondition aircondition; //傳參 public Facade(SubSystemA_Light light,SubSystemB_Television television,SubSystemC_Aircondition aircondition){ this.light = light; this.television = television ; this.aircondition =aircondition; } //起床后一鍵開(kāi)電器 public void on{ System.out.prinln("起床了"); light.on(); television.on(); aircondition.on(); } //睡覺(jué)時(shí)一鍵關(guān)電器 System.out.prinln("睡覺(jué)了"); light.off(); television.off(); aircondition.off(); } }

3. 客戶(hù)端調(diào)用:爺爺使用智能遙控器的時(shí)候

public class Facade Pattern{ public static void main(String[] args){ { //實(shí)例化電器類(lèi) SubSystemA_Light light = new SubSystemA_Light(); SubSystemB_Television television = new SubSystemB_Television(); SubSystemC_Aircondition aircondition = new SubSystemC_Aircondition(); //傳參 Facade facade = new Facade(light,television,aircondition); //客戶(hù)端直接與外觀對(duì)象進(jìn)行交互 facade.on; System.out.prinln("可以看電視了"); facade.off; System.out.prinln("可以睡覺(jué)了");

結(jié)果

起床了打開(kāi)了燈打開(kāi)了電視打開(kāi)了空調(diào)可以看電視了睡覺(jué)了關(guān)閉了燈關(guān)閉了電視關(guān)閉了空調(diào)可以睡覺(jué)了

通過(guò)上述這個(gè)常見(jiàn)的生活例子,我相信你已經(jīng)完全明白了外觀模式的原理了!!


3. 優(yōu)缺點(diǎn)

在全面解析完后,我來(lái)分析下其優(yōu)缺點(diǎn):

3.1 優(yōu)點(diǎn)

降低了客戶(hù)類(lèi)與子系統(tǒng)類(lèi)的耦合度,實(shí)現(xiàn)了子系統(tǒng)與客戶(hù)之間的松耦合關(guān)系

只是提供了一個(gè)訪問(wèn)子系統(tǒng)的統(tǒng)一入口,并不影響用戶(hù)直接使用子系統(tǒng)類(lèi) 減少了與子系統(tǒng)的關(guān)聯(lián)對(duì)象,實(shí)現(xiàn)了子系統(tǒng)與客戶(hù)之間 的松耦合關(guān)系,松耦合使得子系統(tǒng)的組件變化不會(huì)影響到它的客戶(hù)。

外觀模式對(duì)客戶(hù)屏蔽了子系統(tǒng)組件,從而簡(jiǎn)化了接口,減少了客戶(hù)處理的對(duì)象數(shù)目并使子系統(tǒng)的使用更加簡(jiǎn)單。

引入外觀角色之后,用戶(hù)只需要與外觀角色交互; 用戶(hù)與子系統(tǒng)之間的復(fù)雜邏輯關(guān)系由外觀角色來(lái)實(shí)現(xiàn)

降低原有系統(tǒng)的復(fù)雜度和系統(tǒng)中的編譯依賴(lài)性,并簡(jiǎn)化了系統(tǒng)在不同平臺(tái)之間的移植過(guò)程

因?yàn)榫幾g一個(gè)子系統(tǒng)一般不需要編譯所有其他的子系統(tǒng)。一個(gè)子系統(tǒng)的修改對(duì)其他子系統(tǒng)沒(méi)有任何影響,而且子系統(tǒng)內(nèi)部變化也不會(huì)影響到外觀對(duì)象。

3.2 缺點(diǎn)

在不引入抽象外觀類(lèi)的情況下,增加新的子系統(tǒng)可能需要修改外觀類(lèi)或客戶(hù)端的源代碼,違背了“開(kāi)閉原則”不能很好地限制客戶(hù)使用子系統(tǒng)類(lèi),如果對(duì)客戶(hù)訪問(wèn)子系統(tǒng)類(lèi)做太多的限制則減少了可變性和靈活性。

4. 應(yīng)用場(chǎng)景

要為一個(gè)復(fù)雜的子系統(tǒng)對(duì)外提供一個(gè)簡(jiǎn)單的接口提供子系統(tǒng)的獨(dú)立性客戶(hù)程序與多個(gè)子系統(tǒng)之間存在很大的依賴(lài)性 引入外觀類(lèi)將子系統(tǒng)與客戶(hù)以及其他子系統(tǒng)解耦,可以提高子系統(tǒng)的獨(dú)立性和可移植性。 在層次化結(jié)構(gòu)中,可以使用外觀模式定義系統(tǒng)中每一層的入口 層與層之間不直接產(chǎn)生聯(lián)系,而通過(guò)外觀類(lèi)建立聯(lián)系,降低層之間的耦合度。

5. 與適配器模式的區(qū)別

外觀模式的實(shí)現(xiàn)核心主要是——由外觀類(lèi)去保存各個(gè)子系統(tǒng)的引用,實(shí)現(xiàn)由一個(gè)統(tǒng)一的外觀類(lèi)去包裝多個(gè)子系統(tǒng)類(lèi),然而客戶(hù)端只需要引用這個(gè)外觀類(lèi),然后由外觀類(lèi)來(lái)調(diào)用各個(gè)子系統(tǒng)中的方法。這樣的實(shí)現(xiàn)方式非常類(lèi)似適配器模式,然而外觀模式與適配器模式不同的是:適配器模式是將一個(gè)對(duì)象包裝起來(lái)以改變其接口,而外觀是將一群對(duì)象 ”包裝“起來(lái)以簡(jiǎn)化其接口。它們的意圖是不一樣的,適配器是將接口轉(zhuǎn)換為不同接口,而外觀模式是提供一個(gè)統(tǒng)一的接口來(lái)簡(jiǎn)化接口

6. 總結(jié)

本文主要對(duì)外觀模式進(jìn)行了全面介紹,接下來(lái)將介紹其他設(shè)計(jì)模式,有興趣可以繼續(xù)關(guān)注Carson_Ho的最易懂的設(shè)計(jì)模式解析筆記!!!!


請(qǐng)幫頂或評(píng)論點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫(xiě)作的最大動(dòng)力!

相關(guān)文章閱讀 單例模式(Singleton) - 最易懂的設(shè)計(jì)模式解析 簡(jiǎn)單工廠模式(SimpleFactoryPattern)- 最易懂的設(shè)計(jì)模式解析 工廠方法模式(Factory Method)- 最易懂的設(shè)計(jì)模式解析 抽象工廠模式(Abstract Factory)- 最易懂的設(shè)計(jì)模式解析 策略模式(Strategy Pattern)- 最易懂的設(shè)計(jì)模式解析 適配器模式(Adapter Pattern)- 最易懂的設(shè)計(jì)模式解析 代理模式(Proxy Pattern)- 最易懂的設(shè)計(jì)模式解析 模板方法模式(Template Method) - 最易懂的設(shè)計(jì)模式解析 建造者模式(Builder Pattern)- 最易懂的設(shè)計(jì)模式解析 外觀模式(Facade Pattern) - 最易懂的設(shè)計(jì)模式解析


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南涧| 黎城县| 南涧| 娄烦县| 麻城市| 邛崃市| 托里县| 东莞市| 增城市| 安图县| 行唐县| 九龙城区| 静海县| 九江市| 秦安县| 越西县| 淄博市| 天门市| 吉隆县| 玛多县| 称多县| 湘阴县| 北海市| 台前县| 奉化市| 观塘区| 隆安县| 红桥区| 岳阳市| 竹北市| 宣化县| 南涧| 彩票| 吉隆县| 攀枝花市| 华坪县| 浏阳市| 正宁县| 萨嘎县| 临夏县| 巴彦淖尔市|