0%

设计模式之Facade模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
外观模式是一种非常简单的模式,简单到我们经常都会使用.

介绍

  • 意图: 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
  • 何时使用:
    • 客户端不需要知道系统内部的复杂联系,整个系统只需提供一个”接待员”即可
    • 定义系统的入口。
  • 客户端不与系统耦合,外观类与系统耦合
  • 主要实现: 在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
  • 应用实例:
    • 去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便
    • JAVA 的三层开发模式。
  • 优点:
    • 减少系统相互依赖
    • 提高灵活性
    • 提高安全性
  • 缺点:
    • 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
  • 使用场景
    • 为复杂的模块或子系统提供外界访问的模块。
    • 子系统相对独立
    • 预防低水平人员带来的风险。
  • 注意事项: 在层次化结构中,可以使用外观模式定义系统中每一层的入口。

实现

  • 示例1:先举一个简单的例子
    我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMaker
    ShapeMaker 类使用实体类来代表用户对这些类的调用。FacadePatternDemo,我们的演示类使用 ShapeMaker 类来显示结果。

  1. 先创建个接口
    Shape.java
    1
    2
    3
    4
    5
    package com.edu.tju.GOF.Facade.demo1;

    public interface Shape {
    void draw();
    }
  2. 创建实现接口的实体类
    Circle.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package com.edu.tju.GOF.Facade.demo1;

    public class Circle implements Shape {

    @Override
    public void draw() {
    System.out.println("Circle::draw()");
    }
    }
    Rectangle.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package com.edu.tju.GOF.Facade.demo1;

    public class Rectangle implements Shape {

    @Override
    public void draw() {
    System.out.println("Rectangle::draw()");
    }
    }
    Square.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package com.edu.tju.GOF.Facade.demo1;

    public class Square implements Shape {

    @Override
    public void draw() {
    System.out.println("Square::draw()");
    }
    }
  3. 创建外观类
    ShapeMaker.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package com.edu.tju.GOF.Facade.demo1;

    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();
    }
    }
  4. 使用外观类

FacadePatternDemo.java

1
2
3
4
5
6
7
8
9
10
11
package com.edu.tju.GOF.Facade.demo1;

public class FacadePatternDemo {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();

shapeMaker.drawCircle();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
}
}
  • 示例2:

DataBase类:
Database可获取指定数据库名所对应的Properties的示例

1
2


HTMLWriter类

1
2


PageMaker类

1
2


角色

  • facde(窗口)

  • classX(构成系统的其它角色)

  • client(业务场景,调用者)

  • Facade模式的类图

对外的API(接口)变少了,client只需要关注facade的public接口,而不用关心它下面的那些复杂逻辑

Thank you for your support