外观模式
1 概述
- 外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更加容易使用。
- 外观模式通过定义一个高层接口,让子系统的使用更加简单,并且减少了客户端与子系统之间的耦合。
2 优缺点及应用场景
2.1 优点
- 1)简化接口:提供了一个简单的接口,减少了子系统的复杂性,使得子系统更加易用。
- 2)减少客户端与子系统之间的耦合:客户端不需要直接与子系统的多个模块交互,减少了代码的耦合度。
- 3)更好的划分访问层次:可以有选择地暴露子系统的功能,避免不必要的访问。
2.2 缺点
- 1)单一职责原则的潜在破坏:外观类承担了过多的职责,可能会变得臃肿,难以维护。
- 2)不易扩展:当子系统需要扩展时,外观类也需要相应的修改,可能影响稳定性。
2.3 应用场景
- 1)简化复杂系统的使用:当需要简化复杂系统的使用接口时,可以使用外观模式。
- 2)分层结构:在分层结构中使用外观模式,可以定义每一层的入口,降低层之间的耦合。
- 3)遗留系统的集成:使用外观模式提供遗留系统的简单接口,便于集成和交互。
3 结构
- 1)外观(Facade):提供统一的接口,用来访问子系统中的各个接口。
- 2)子系统(Subsystem):子系统实现子系统的功能。处理Facade对象指派的任务,子系统中没有外观的相关信息,也没有Facade接口。
4 实现
4.1 UML 类图

4.2 代码示例
interface Shape {
void draw();
}
class Square implements Shape {
@Override
public void draw() {
System.out.println("Square::draw()");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle::draw()");
}
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle::draw()");
}
}
class ShapeMaker {
private Shape square;
private Shape rectangle;
private Shape circle;
public ShapeMaker() {
square = new Square();
rectangle = new Rectangle();
circle = new Circle();
}
public void drawSquare() {
square.draw();
}
public void drawRectangle() {
rectangle.draw();
}
public void drawCircle() {
circle.draw();
}
}
public class FacadePatternDemo {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawSquare();
shapeMaker.drawRectangle();
shapeMaker.drawCircle();
}
}
Square::draw()
Rectangle::draw()
Circle::draw()
5 总结
- 外观模式通过提供一个高层接口,使得子系统的使用更加简单,并且减少了客户端与子系统之间的耦合。它适用于简化复杂系统的使用、分层结构以及遗留系统的集成等场景。虽然外观模式提高了系统的易用性和可维护性,但也可能导致外观类过于臃肿,不易扩展。合理地使用外观模式,可以有效地管理系统的复杂性,提供简洁的接口。