一、外观模式定义
外观模式(Facade):为子系统的访问定义了对外的接口,隐藏了子系统内部调用的复杂性,从而使得外部对子系统的调用更方便,只需要调用这个接口即可。
举个例子,加入某人手里有点钱,想买股票,但是股票太多了,要去一个一个的了解太复杂了,因此有了基金经理和基金,只需要从基金经理手里买一定份额就行,剩下的炒股操作就交给基金经理了。买股票的人就相当于外部调用,股票就相当于复杂的子系统内部,而基金经理就相当于封装好的接口。
### 二、代码实例
我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMaker。
ShapeMaker 类使用实体类来代表用户对这些类的调用。FacadePatternDemo,我们的演示类使用 ShapeMaker 类来显示结果。
在这个例子中,ShapeMaker负责具体的去处理画什么图像,外部只需要调用ShapeMaker提供的方法即可,而具体的实现就在各个具体的图形中。类图如下:
首先创建接口:
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 FacadePatternDemo {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawCircle();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
}
}
三、外观模式的优缺点
优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。效果图如下,可把一个复杂相互交叉的系统重构为依赖较少的系统:
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。4、为了维护一个遗留的大型老系统,同时也要兼容新系统的情况,为了让新老系统方便交互,可以中间加一层Facade。