1、外观模式的概念
外观模式,英文Facade Pattern,属于结构型模式。该模式会隐藏系统的复杂性,对外提供一个可以访问系统的简单接口。该模式涉及到一个类,该类中提供了客户端请求的简化方法和对现有系统方法的一种委托调用。
2、外观模式的特点
- 向现有系统添加一个接口,来隐藏系统的复杂性。
3、关于外观模式
- 使用目的:为子系统中的一组接口提供一个一致的界面,定义一个高层接口,使得系统更加容易使用。
- 解决问题:降低访问系统的复杂度,简化客户端和系统之间的接口。
- 使用时机:
- 客户端不必知道系统内部的复杂联系,整个系统只需要提供一个简单的访问接口。
- 一般定义系统的入口时,会简化其接口。
- 保证外观:客户端不用和系统有耦合关系,外观类和系统耦合。
- 外观关键:在客户端和复杂系统之间增加一个中间层,在中间层中处理好调用以及依赖等关系等。
4、外观模式的优缺点
优点:
- 减少了系统各部分之间的相互依赖。
- 提高了系统的灵活性。
- 由于对外部隐藏了细节,只提供一个统一访问接口,因此系统的安全性得到了保障。
缺点:
- 严重不符合设计原则中的开闭原则,如果要修改某些内容将变的非常麻烦,继承和重写都不太适用。
5、外观模式的使用场景
- 为复杂的模块或子系统提供外界访问系统的统一模块。
- 子系统相对来说比较独立时。
- 为了避免由于不当操作造成系统内部结构损坏时,这时隐藏内部细节,对外只提供统一的访问接口就很合适。
6、外观模式的实现
将创建一个Shape接口和实现了Shape接口的实体类。然后定义一个外观类 ShapeMaker。ShapeMaker类使用实体类来代表用户对这些类的调用。FacadePatternDemo类使用ShapeMaker类来显示结果。如下图示:
(1)定义Shape接口和实现类
public interface Shape {
void draw();
}
/*
* 接口实现类
*/
public class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("描绘长方矩形!");
}
}
public class Square implements Shape{
@Override
public void draw() {
System.out.println("描绘正方形!");
}
}
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("描绘圆形!");
}
}
(2)定义外观类
外观类中定义访问各个子系统的方法,相当于一个唯一入口,如下:
public class ShapeMaker {
private Shape rectangle;
private Shape square;
private Shape circle;
// 构造器
public ShapeMaker() {
// 实例化子类对象
rectangle = new Rectangle();
square = new Square();
circle = new Circle();
}
// 定义访问各个子类的方法
public void drawRectangle() {
rectangle.draw();
}
public void drawSquare() {
square.draw();
}
public void drawCircle() {
circle.draw();
}
}
(3)测试
public class Test {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
shapeMaker.drawCircle();
}
}
7、小结
当需要对外部隐藏系统的内部细节时,可以考虑使用外观模式来进行设计,对外提供一个统一的简单访问接口,这个接口是访问系统的唯一入口,此入口既可以降低对系统访问的复杂度,也可以起到一个关卡的作用,一定程度上可以保护系统安全。