深入理解Java設(shè)計(jì)模式之外觀模式
一、什么是外觀模式
定義:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,用來(lái)訪問(wèn)子系統(tǒng)中的一群接口。

外觀模式組成:
Facade:負(fù)責(zé)子系統(tǒng)的的封裝調(diào)用
Subsystem Classes:具體的子系統(tǒng),實(shí)現(xiàn)由外觀模式Facade對(duì)象來(lái)調(diào)用的具體任務(wù)
二、外觀模式的使用場(chǎng)景
1、設(shè)計(jì)初期階段,應(yīng)該有意識(shí)的將不同層分離,層與層之間建立外觀模式;
2、開(kāi)發(fā)階段,子系統(tǒng)越來(lái)越復(fù)雜,增加外觀模式提供一個(gè)簡(jiǎn)單的調(diào)用接口;
3、維護(hù)一個(gè)大型遺留系統(tǒng)的時(shí)候,可能這個(gè)系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展,但又包含非常重要的功能,為其開(kāi)發(fā)一個(gè)外觀類,以便新系統(tǒng)與其交互。
三、外觀模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、實(shí)現(xiàn)了子系統(tǒng)與客戶端之間的松耦合關(guān)系;
2、客戶端屏蔽了子系統(tǒng)組件,減少了客戶端所需處理的對(duì)象數(shù)目,并使得子系統(tǒng)使用起來(lái)更加容易。
缺點(diǎn):
1、不符合開(kāi)閉原則,如果要修改某一個(gè)子系統(tǒng)的功能,通常外觀類也要一起修改;
2、沒(méi)有辦法直接阻止外部不通過(guò)外觀類訪問(wèn)子系統(tǒng)的功能,因?yàn)樽酉到y(tǒng)類中的功能必須是公開(kāi)的(根據(jù)需要決定是否使用internal訪問(wèn)級(jí)別可解決這個(gè)缺點(diǎn),但外觀類需要和子系統(tǒng)類在同一個(gè)程序集內(nèi))。
四、外觀模式的實(shí)現(xiàn)
先寫出四個(gè)子系統(tǒng)的類
class SubSystemOne
{
public void MethodOne()
{
Console.WriteLine("子系統(tǒng)方法一");
}
}
class SubSystemTwo
{
public void MethodTwo()
{
Console.WriteLine("子系統(tǒng)方法二");
}
}
class SubSystemThree
{
public void MethodThree()
{
Console.WriteLine("子系統(tǒng)方法三");
}
}
class SubSystemFour
{
public void MethodFour()
{
Console.WriteLine("子系統(tǒng)犯法四");
}
}
引入外觀類,減少子系統(tǒng)類之間的交互
class Facade
{
SubSystemOne one;
SubSystemTwo two;
SubSystemThree three;
SubSystemFour four;
public Facade()
{
one = new SubSystemOne();
two = new SubSystemTwo();
three = new SubSystemThree();
four = new SubSystemFour();
}
public void MethodA()
{
Console.WriteLine("\n方法組合A()---");
one.MethodOne();
two.MethodTwo();
four.MethodFour();
}
public void MethodB()
{
Console.WriteLine("\n方法組B()---");
two.MethodTwo();
three.MethodThree();
}
}
客戶端代碼:
static void Main(string[] args)
{
Facade facade = new Facade();
facade.MethodA();
facade.MethodB();
Console.Read();
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
歸并算法之有序數(shù)組合并算法實(shí)現(xiàn)
這篇文章主要介紹了歸并算法之有序數(shù)組合并算法實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07
java基本教程之java線程等待與java喚醒線程 java多線程教程
這篇文章主要介紹了對(duì)線程等待/喚醒方法,文中使用了多個(gè)示例,大家參考使用吧2014-01-01
Java實(shí)現(xiàn)二叉查找樹(shù)的增刪查詳解
二叉查找樹(shù)(ADT)是一個(gè)具有對(duì)于樹(shù)種的某個(gè)節(jié)點(diǎn)X,它的左節(jié)點(diǎn)都比X小,它的右節(jié)點(diǎn)都比X大的二叉樹(shù)。本文將用Java實(shí)現(xiàn)二叉查找樹(shù)的增刪查,需要的可以參考一下2022-06-06
Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析
這篇文章主要為大家介紹了Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Java實(shí)現(xiàn)英文句子中的單詞順序逆序輸出的方法
這篇文章主要介紹了Java實(shí)現(xiàn)英文句子中的單詞順序逆序輸出的方法,涉及java字符串遍歷、判斷、截取、輸出等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
spring通過(guò)構(gòu)造函數(shù)注入實(shí)現(xiàn)方法分析
這篇文章主要介紹了spring通過(guò)構(gòu)造函數(shù)注入實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了spring通過(guò)構(gòu)造函數(shù)注入的原理、實(shí)現(xiàn)步驟及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10
spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例
這篇文章主要介紹了spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
java面向?qū)ο蟮娜筇匦灾焕^承用法實(shí)例分析
這篇文章主要介紹了java面向?qū)ο蟮娜筇匦灾焕^承用法,結(jié)合實(shí)例形式分析了java面向?qū)ο蟪绦蛟O(shè)計(jì)中繼承的基本原理與具體使用方法,需要的朋友可以參考下2019-11-11

