說明
記錄下學(xué)習(xí)設(shè)計模式-外觀模式的寫法。JDK使用版本為1.8版本。
Facade(外觀)
意圖:為子系統(tǒng)中的一組接口提供一個一致的界面,F(xiàn)acade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
結(jié)構(gòu):
其中:
- Facade知道哪些子系統(tǒng)類負(fù)責(zé)處理請求;將客戶的請求代理給適合的子系統(tǒng)對象。
- Subsystem classes實(shí)現(xiàn)子系統(tǒng)的功能;處理有Facade對象指派的任務(wù);沒有Facade的任何相關(guān)信息,即沒有指向Facade的指針。
適用性:
- 對分層結(jié)構(gòu)系統(tǒng)構(gòu)建時,使用外觀模式定義子系統(tǒng)中每層的入口點(diǎn)可以簡化子系統(tǒng)之間的依賴關(guān)系。
- 當(dāng)一個復(fù)雜系統(tǒng)的子系統(tǒng)很多時,外觀模式可以為系統(tǒng)設(shè)計一個簡單的接口供外界訪問。
- 當(dāng)客戶端與多個子系統(tǒng)之間存在很大的聯(lián)系時,引入外觀模式可將它們分離,從而提高子系統(tǒng)的獨(dú)立性和可移植性。
目錄
外觀模式示例類圖
以該UML類圖實(shí)現(xiàn)外觀模式示例。
電燈類
package com.example.deesign_patterns.facade;
//電燈類
public class Light {
//開燈
public void on(){
System.out.println("打開電燈。。。");
}
//關(guān)燈
public void off(){
System.out.println("關(guān)閉電燈。。。");
}
}
電視機(jī)類
package com.example.deesign_patterns.facade;
//電視機(jī)類
public class TV {
//開電視機(jī)
public void on(){
System.out.println("打開電視機(jī)。。。");
}
//關(guān)電視機(jī)
public void off(){
System.out.println("關(guān)閉電視機(jī)。。。");
}
}
空調(diào)類
package com.example.deesign_patterns.facade;
//空調(diào)類
public class AirCondition {
//開空調(diào)
public void on(){
System.out.println("打開空調(diào)。。。");
}
//關(guān)空調(diào)
public void off(){
System.out.println("關(guān)閉空調(diào)。。。");
}
}
智能音箱外觀類
package com.example.deesign_patterns.facade;
//智能音箱外觀類,用戶主要和該類對象進(jìn)行交互
public class SmartAppliancesFacade {
//聚合電燈對象、電視機(jī)對象、空調(diào)對象
private Light light;
private TV tv;
private AirCondition airCondition;
public SmartAppliancesFacade() {
light=new Light();
tv=new TV();
airCondition=new AirCondition();
}
//語音控制方法
public void say(String message){
if(message.contains("打開")){
on();
}else if(message.contains("關(guān)閉")){
off();
}else {
System.out.println("我還聽不懂你說的!!!");
}
}
//一鍵打開功能
private void on(){
light.on();
tv.on();
airCondition.on();
}
//一鍵關(guān)閉功能
private void off(){
light.off();
tv.off();
airCondition.off();
}
}
測試類
package com.example.deesign_patterns.facade;
//測試類
public class Client {
public static void main(String[] args) {
//創(chuàng)建智能音箱對象
SmartAppliancesFacade facade=new SmartAppliancesFacade();
//控制家電
facade.say("打開家電");
System.out.println("===============");
facade.say("關(guān)閉家電");
}
}
好處:文章來源:http://www.zghlxwxcb.cn/news/detail-501164.html
- 降低了子系統(tǒng)與客戶端之間的耦合度,使得子系統(tǒng)的變化不會影響調(diào)用它的客戶類。
- 對客戶屏蔽了子系統(tǒng)組件,減少了客戶處理的對象數(shù)目,并使得子系統(tǒng)使用起來更加容易。
缺點(diǎn):
不符合開閉原則,修改起來很麻煩。文章來源地址http://www.zghlxwxcb.cn/news/detail-501164.html
到了這里,關(guān)于設(shè)計模式之外觀模式筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!