目录
1. 外观模式
- 1. 外观模式
- 1.1 定义、优缺点、适用场景
- 1.2 模式的结构与实现
生活中,我们买菜要去菜市场,买水果要去水果店,买零食要去零食店。这需要去很多地方。这时超市(外观模式)出现了,在超市里你可以买到菜、水果、零食
1.1 定义、优缺点、适用场景定义:外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个统一的接口。客户端不用关心内部子系统的具体细节,内部子系统的改变而不影响客户端。这样会大大降低应用程序的耦合度,提高了程序的可维护性
外观模式是迪米特法则的典型应用,优点如下:
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户端
- 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易
- 降低了大型软件系统中的编译依赖性,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象
缺点:
- 不能很好地限制客户使用子系统类,很容易带来未知风险
- 增加新的子系统可能需要修改外观类,违背了“开闭原则”
适用场景:
- 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系
- 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问
- 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性
结构:
- 外观(Facade)角色:为多个子系统对外提供一个共同的接口
- 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它
- 客户(Client)角色:通过一个外观角色访问各个子系统的功能
实现:
public class FacadeTest {
public static void main(String[] args) {
SuperMarket superMarket = new SuperMarket();
superMarket.buyGood();
}
}
// 外观角色: 超市
class SuperMarket {
private VegetableArea vegetableArea = new VegetableArea();
private FruitArea fruitArea = new FruitArea();
public void buyGood() {
vegetableArea.buyVegetable();
fruitArea.buyFruit();
}
}
// 子系统角色:买菜区域
class VegetableArea {
public void buyVegetable() {
System.out.println("在买菜区域买菜");
}
}
// 子系统角色:水果区域
class FruitArea {
public void buyFruit() {
System.out.println("在水果区域买水果");
}
}
运行程序,结果如下:
在买菜区域买菜
在水果区域买水果