类结构

图片说明

UML类图

图片说明

初步理解

去火车站,不知道去哪个站台等车,因此有一个大屏幕,会告诉你去哪里检票。这个大屏幕隐藏了火车站站台的细节,而是直接告诉你去哪就行。

代码理解

底部接口

public interface Shape {
    void draw();
}

接口的三个实现类

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("画圈圈");
    }
}

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 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 Demo {
    public static void main(String[] args) {
        ShapeMaker shapeMaker = new ShapeMaker();

        shapeMaker.drawCircle();
        shapeMaker.drawRectangle();
        shapeMaker.drawSquare();
    }
}

测试结果

画圈圈
画矩形
正方形

总结

  • 我们可以看到,我们直接用一个外观类,就完成了想要的所有功能。
  • 这里必须理解下,外观模式和代理模式。外观模式是一个类将其他所有类都包装好了,然后给你用。而代理模式(静态的)是一个类去代理一个基础类。相同之处时都是使用了中间类去完成功能。
  • 外观模式是一对多,代理模式是一对一(一个类代理一个类)。即使是动态代理,一个类完成多个类的代理,但是也是由反射完成对应类的寻找,而不是在类中封装多个类属性,封装多个属性的,更加偏向外观模式的定义。