介绍
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个可以访问的接口。这种类型的设计模式属于结构型模式。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
应用场景
(1)对于一个复杂的子系统,需要为用户提供一个简单的交互操作。
(2)不希望客户代码和子系统中的类有耦合,以便提高子系统的独立性和可移植性。
(3)当整个系统需要构建一个层次结构的子系。
模式结构
(1)子系统(Subsystem):子系统是若干个类的集合。这些类的实例协同合作为用户提供所需要的功能,子系统中任何类都不包含外观类的实例引用。
(2)外观(Facade):外观是一个类,该类包含子系统中全部或者部分类的实例引用。用户通过外观类来调用功能,代替了子系统中的若干个类的实例打交道。
代码案例
创建一个接口:
public interface Shape {
void draw();
}
添加多个实现类:
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle::draw()");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square::draw()");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle::draw()");
}
}
创建外观类:
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 drawCircle(){
circle.draw();
}
public void drawRectangle(){
rectangle.draw();
}
public void drawSquare(){
square.draw();
}
}
public class ApplicationTest {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawCircle();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
}
}
运行结果:
优点
(1)使客户和子系统中的类无耦合,并且是子系统使用起来更加方便。
(2)外观只是提供了一个更加简洁的界面,并不影响用户直接使用子系统中的类。
(3)子系统中任何类对其方法的内容进行修改,不影响外观类的代码。