描述
????外觀模式是對(duì)象的結(jié)構(gòu)模式侥锦,外部與一個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的外部對(duì)象進(jìn)行视搏。外觀模式提供一個(gè)高層次的接口伟墙,使得子系統(tǒng)更易于使用钳吟。
簡(jiǎn)介
????外觀模式通過(guò)為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,而使這些子系統(tǒng)更加容易被訪問(wèn)的模式贴见。該模式對(duì)外有一個(gè)統(tǒng)一接口烘苹,外部應(yīng)用程序不用關(guān)心內(nèi)部子系統(tǒng)的具體的細(xì)節(jié),這樣會(huì)大大降低應(yīng)用程序的復(fù)雜度片部,提高了程序的可維護(hù)性镣衡。
角色
- 外觀(Facade)角色 :為多個(gè)子系統(tǒng)對(duì)外提供一個(gè)共同的接口。
- 子系統(tǒng)(SubSystem)角色 :實(shí)現(xiàn)系統(tǒng)的部分功能档悠,客戶可以通過(guò)外觀角色訪問(wèn)它廊鸥。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 降低了客戶端與子系統(tǒng)的耦合關(guān)系,讓子系統(tǒng)內(nèi)部的模塊能更容易擴(kuò)展和維護(hù)辖所。
- 讓子系統(tǒng)更加易用惰说,客戶端不再需要了解子系統(tǒng)內(nèi)部的實(shí)現(xiàn),也不需要跟眾多子系統(tǒng)內(nèi)部的模塊進(jìn)行交互缘回,只需要跟外觀對(duì)象交互就可以了吆视。
- 通過(guò)合理使用Facade,可以幫助我們更好地劃分訪問(wèn)的層次酥宴。有些方法是對(duì)系統(tǒng)外的啦吧,有些方法是系統(tǒng)內(nèi)部使用的。把需要暴露給外部的功能集中到外觀中拙寡,這樣既方便客戶端使用授滓,也很好地隱藏了內(nèi)部的細(xì)節(jié)。
缺點(diǎn)
- 增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼肆糕,違背了“開(kāi)閉原則”般堆。
使用場(chǎng)景
- 對(duì)分層結(jié)構(gòu)系統(tǒng)構(gòu)建時(shí),使用外觀模式定義子系統(tǒng)中每層的入口點(diǎn)可以簡(jiǎn)化子系統(tǒng)之間的依賴關(guān)系擎宝。
- 當(dāng)一個(gè)復(fù)雜系統(tǒng)的子系統(tǒng)很多時(shí)郁妈,外觀模式可以為系統(tǒng)設(shè)計(jì)一個(gè)簡(jiǎn)單的接口供外界訪問(wèn)。
- 當(dāng)客戶端與多個(gè)子系統(tǒng)之間存在很大的聯(lián)系時(shí)绍申,引入外觀模式可將它們分離,從而提高子系統(tǒng)的獨(dú)立性和可移植性。
示例
public interface Shape {
void draw();
}
/**
* 子系統(tǒng)(SubSystem)角色
*/
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Circle:draw()!");
}
}
/**
* 子系統(tǒng)(SubSystem)角色
*/
public class Square implements Shape{
@Override
public void draw() {
System.out.println("Square:draw()!");
}
}
/**
* 子系統(tǒng)(SubSystem)角色
*/
public class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("Rectangle:draw()!");
}
}
/**
* 外觀(Facade)角色
*/
public class ShapeMaker {
private Shape circle;
private Shape rectangle;
private Shape square;
public ShapeMaker() {
circle = new Circle();
rectangle = new Rectangle();
square = new Square();
}
public void drawAll() {
circle.draw();
rectangle.draw();
square.draw();
}
}
public class FacadeDemo {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawAll();
}
}