外觀模式
外觀模式屬于結(jié)構(gòu)型設(shè)計(jì)模式.
簡(jiǎn)單來(lái)說(shuō)外觀模式就是一個(gè)比較牛逼的封裝理解而已.將一系列的操作,功能封裝在一起,供外部調(diào)用,外部調(diào)用者不關(guān)心內(nèi)部實(shí)現(xiàn)細(xì)節(jié).
比如常規(guī)開(kāi)發(fā)中的網(wǎng)絡(luò)框架封裝,會(huì)定義一個(gè)頂層的類,將一系列的請(qǐng)求方法,緩存處理,tag標(biāo)識(shí)等全部封裝在一個(gè)類暴露方法給外部使用者調(diào)用,這樣即便在后期我們更換了網(wǎng)絡(luò)框架,所修改的也僅僅只是最頂層的類,而不會(huì)影響到外部的調(diào)用.
應(yīng)用場(chǎng)景
- 為復(fù)雜的模塊提供外部訪問(wèn)模塊
- 各個(gè)模塊相互獨(dú)立,可封裝在一起
- 如果是層次結(jié)構(gòu),可定義每一個(gè)層次之間的接口,將層次之間的耦合降低
代碼示例
現(xiàn)在有3個(gè)同學(xué),A同學(xué)會(huì)唱歌/跳舞,B同學(xué)會(huì)跳舞和彈鋼琴,C同學(xué)會(huì)格斗.
在學(xué)校表演上,跳舞的同學(xué)要全部去跳舞,唱歌的唱歌,彈鋼琴的彈鋼琴,格斗的格斗.
常規(guī)設(shè)計(jì)外部使用者需要分別對(duì)每一個(gè)同學(xué)調(diào)用方法.
看外觀模式如何使用封裝解決問(wèn)題
(一)每個(gè)同學(xué)的特長(zhǎng)
- StudentA
public class StudentA {
public StudentA() {
}
public void dance() {
System.out.println("跳舞的同學(xué):StudentA");
}
public void sing() {
System.out.println("唱歌的同學(xué):StudentA");
}
}
- StudentB
public class StudentB {
public StudentB() {
}
public void dance() {
System.out.println("跳舞的同學(xué):StudentB");
}
public void playThePiano() {
System.out.println("彈鋼琴的同學(xué):StudentB");
}
}
- StudenC
public class StudentC {
public StudentC() {
}
public void combat() {
System.out.println("格斗的同學(xué):StudentC");
}
}
(二)將具有同樣特長(zhǎng)的同學(xué)封裝在外觀中
public class Facade {
private StudentA studentA;
private StudentB studentB;
private StudentC studentC;
public Facade() {
studentA=new StudentA();
studentB=new StudentB();
studentC=new StudentC();
}
public Facade(StudentA studentA, StudentB studentB, StudentC studentC) {
this.studentA = studentA;
this.studentB = studentB;
this.studentC = studentC;
}
//跳舞的同學(xué)
public void dance(){
studentA.dance();
studentB.dance();
}
//唱歌的同學(xué)
public void sing(){
studentA.sing();
}
//唱歌的同學(xué)
public void playThePiano(){
studentB.playThePiano();
}
//格斗的同學(xué)
public void combat(){
studentC.combat();
}
}
調(diào)用方式
Facade facade=new Facade();
facade.dance();
facade.sing();
facade.playThePiano();
facade.combat();
顯示結(jié)果
跳舞的同學(xué):StudentA
跳舞的同學(xué):StudentB
唱歌的同學(xué):StudentA
彈鋼琴的同學(xué):StudentB
格斗的同學(xué):StudentC
總結(jié)
- 優(yōu)點(diǎn)
- 內(nèi)部細(xì)節(jié)改變只需修改外觀類,不影響外部使用者的調(diào)用
- 外部使用者不必關(guān)心具體核心內(nèi)部實(shí)現(xiàn)過(guò)程,只需要關(guān)心和外觀的交接
- 缺點(diǎn)
- 如果外觀類不抽象,增加新的功能模塊,需要修改外觀類和客戶端新增調(diào)用方式,違背了【開(kāi)閉原則】
外觀模式就是一個(gè)封裝,通過(guò)松散的耦合解決客戶端的使用便捷性以及后期的維護(hù)更新.
唯一缺點(diǎn)【開(kāi)閉原則】在后期維護(hù)以及便捷性的比較來(lái)說(shuō)上個(gè)人覺(jué)得不算太大缺點(diǎn),凡事都是有利有弊,各自取舍即可.