目錄
什么是外觀模式
外觀模式的實現(xiàn)
外觀模式角色
外觀模式舉例
外觀模式類圖
外觀模式代碼實現(xiàn)
外觀模式的特點
優(yōu)點
缺點
注意事項
應用場景
總結(jié)
什么是外觀模式
????????外觀模式(Facade Pattern):又叫作門面模式,歸屬于結(jié)構(gòu)型模式。外觀模式定義了提供了定義了一個統(tǒng)一的高層接口,即為子系統(tǒng)中的一組接口提供一個一致的訪問入口,使子系統(tǒng)更容易被外部程序統(tǒng)一調(diào)用。外部應用程序不用關心內(nèi)部子系統(tǒng)的具體細節(jié),這樣會大大降低應用程序的復雜度,提高了程序的可維護性。
????????外觀模式是為了解決類與類之家的依賴關系的,像spring一樣,可以將類和類之間的關系配置到配置文件中,而外觀模式就是將他們的關系放在一個Facade類中,降低了類類之間的耦合度。
外觀模式的實現(xiàn)
外觀模式角色
- 外觀角色(Facade):為多個子系統(tǒng)對外提供一個共同的接口,知道哪些子系統(tǒng)負責處理請求,將客戶端的請求轉(zhuǎn)發(fā)給適當?shù)淖酉到y(tǒng)對象。
- 子系統(tǒng)角色(Sub System):實現(xiàn)子系統(tǒng)的功能,處理外觀角色指派的任務。客戶可以通過外觀角色訪問它。子系統(tǒng)在整個系統(tǒng)中可以是一個或多個模塊,每個模塊都有若干類組成,這些類可能相互之間有著比較復雜的關系。
- 客戶角色(Client):調(diào)用外觀角色訪問各個子系統(tǒng)的功能。
外觀模式舉例
????????舉個例子: 比如去圖書館借書, 但圖書館很大不知道所要的東西在哪里. 于是就去問圖書館管理員, 圖書館管理員會馬上找到你所要的圖書. 這里面我們不用了解圖書館圖書的擺放, 直接找圖書館管理員即可. 圖書館管理員這里就是門面, 圖書的擺放就是內(nèi)部構(gòu)造.
????????這里你代表客戶角色,圖書代表子系統(tǒng)角色,圖書館管理員代表外觀角色。
外觀模式類圖
外觀模式代碼實現(xiàn)
? ? ? ??舉個例子,一美女下班回家,第一件開門,然后是開燈,然后打開空調(diào),打開熱水器,躺在沙發(fā)上準備看電視。在智能家居的場景,所有電器都綁定啦小愛同學上,其他遙控我們無需關注,只需要關注小愛同學就好啦。這個時候我們就可以使用外觀模式。
????????其中:美女屬于客戶角色,小愛同學屬于外觀角色,智能門鎖,電燈,空調(diào),熱水器,電視屬于子系統(tǒng)角色。
子系統(tǒng)角色
package com.common.demo.pattern.facade;
/**
* @author Evan Walker https://www.ayshuju.com
* @version 1.0
* @desc 門鎖 子系統(tǒng)角色
* @date 2023/07/20 11:05:13
*/
public class Lock {
public void open(){
System.out.println("打開門鎖>>>>>>門鎖已打開!");
}
}
package com.common.demo.pattern.facade;
/**
* @author Evan Walker https://www.ayshuju.com
* @version 1.0
* @desc 電燈 子系統(tǒng)角色
* @date 2023/07/20 11:03:03
*/
public class Light {
public void open(){
System.out.println("打開電燈>>>>>>電燈已打開!");
}
}
package com.common.demo.pattern.facade;
/**
* @author Evan Walker https://www.ayshuju.com
* @version 1.0
* @desc 空調(diào) 子系統(tǒng)角色
* @date 2023/07/20 11:07:38
*/
public class AirConditioner {
public void open(){
System.out.println("打開空調(diào)>>>>>>空調(diào)已打開!");
}
}
package com.common.demo.pattern.facade;
/**
* @author Evan Walker https://www.ayshuju.com
* @version 1.0
* @desc 熱水器 子系統(tǒng)角色
* @date 2023/07/20 11:03:53
*/
public class Heater {
public void open(){
System.out.println("打開熱水器>>>>>>熱水器已打開!");
}
}
package com.common.demo.pattern.facade;
/**
* @author Evan Walker https://www.ayshuju.com
* @version 1.0
* @desc 電視 子系統(tǒng)角色
* @date 2023/07/20 11:06:04
*/
public class Tv {
public void open(){
System.out.println("打開電視>>>>>>電視已打開!");
}
}
外觀角色
package com.common.demo.pattern.facade;
/**
* @author Evan Walker https://www.ayshuju.com
* @version 1.0
* @desc 外觀角色
* @date 2023/07/20 10:59:00
*/
public class Facade {
private AirConditioner airConditioner;
private Tv tv;
private Lock lock;
private Light light;
private Heater heater;
public Facade(){
this.airConditioner = new AirConditioner();
this.tv = new Tv();
this.light = new Light();
this.lock = new Lock();
this.heater = new Heater();
}
public void goHome(){
lock.open();
light.open();
airConditioner.open();
heater.open();
tv.open();
}
}
客戶角色
package com.common.demo.pattern.facade;
/**
* @author Evan Walker https://www.ayshuju.com
* @version 1.0
* @desc 客戶角色
* @date 2023/07/20 10:59:15
*/
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.goHome();
}
}
運行測試截圖
文章來源:http://www.zghlxwxcb.cn/news/detail-600055.html
外觀模式的特點
優(yōu)點
- 減少相互依賴:實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關系,子系統(tǒng)的組件變化不會影響到調(diào)用它的客戶類,只需調(diào)整外觀類即可。
- 提高靈活性:對客戶屏蔽子系統(tǒng)組件,減少了客戶處理的對象數(shù)目,客戶代碼使用子系統(tǒng)使用起來更加容易。但并不妨礙客戶直接訪問子系統(tǒng)。
- 提高安全性:更好地劃分訪問層次。
- 迪米特法則:遵循迪米特法則,即最少知道原則。
缺點
- 當增加子系統(tǒng)和擴展系統(tǒng)行為時,可能容易帶來未知風險。
- 不能很好地限制客戶使用子系統(tǒng)類,如果對客戶訪問子系統(tǒng)類做太多的限制則減少了可變性和靈活性。
- 在不引入抽象外觀類的情況下,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
- 某些情況下可能違背單一職責原則。
注意事項
- 在層次化結(jié)構(gòu)中,可使用外觀模式定義系統(tǒng)中每一層的入口。
- 一個系統(tǒng)有多個外觀類,在一個系統(tǒng)中可以設計多個外觀類,每個外觀類都負責和一些特定的子系統(tǒng)交互,向用戶提供相應的業(yè)務功能。
- 不要試圖通過外觀類為子系統(tǒng)增加新行為,外觀模式的用意是為子系統(tǒng)提供一個集中化和簡化的溝通渠道,而不是向子系統(tǒng)加入新的行為,新的行為的增加應該通過修改原有子系統(tǒng)類或增加新的子系統(tǒng)類來實現(xiàn),不能通過外觀類來實現(xiàn)。
- 外觀模式創(chuàng)造出一個外觀對象,將客戶端所涉及的屬于一個子系統(tǒng)的協(xié)作伙伴的數(shù)量減到最少,使得客戶端與子系統(tǒng)內(nèi)部的對象的相互作用被外觀對象所取代。外觀類充當了客戶類與子系統(tǒng)類之間的“第三者”,降低了客戶類與子系統(tǒng)類之間的耦合度,外觀模式就是實現(xiàn)代碼重構(gòu)以便達到“迪米特法則”要求的一個強有力的武器。
- 外觀模式最大的缺點在于違背了“開閉原則”,當增加新的子系統(tǒng)或者移除子系統(tǒng)時需要修改外觀類,可以通過引入抽象外觀類在一定程度上解決該問題,客戶端針對抽象外觀類進行編程。對于新的業(yè)務需求,不修改原有外觀類,而對應增加一個新的具體外觀類,由新的具體外觀類來關聯(lián)新的子系統(tǒng)對象,同時通過修改配置文件來達到不修改源代碼并更換外觀類的目的。
應用場景
- 減少對子系統(tǒng)的依賴性
- 子系統(tǒng)相對獨立且越來越復雜,增加門面模式提供接口
- 構(gòu)建多層系統(tǒng)結(jié)構(gòu),利用門面對象作為每層的入口,簡化層間調(diào)用
總結(jié)
- 外觀模式對客戶端與子系統(tǒng)的耦合關系,讓子系統(tǒng)內(nèi)部的模塊更易維護和擴展。對外屏蔽了子系統(tǒng)的細節(jié),因此外觀模式降低了客戶端對子系統(tǒng)使用的復雜性。當系統(tǒng)需要進行分層設計時,可以考慮外觀模式幫我們更好的劃分訪問的層次。
更多消息資訊,請訪問昂焱數(shù)據(jù)(https://www.ayshuju.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-600055.html
到了這里,關于設計模式結(jié)構(gòu)型——外觀模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!