类结构
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(); } }
测试结果
画圈圈 画矩形 正方形
总结
- 我们可以看到,我们直接用一个外观类,就完成了想要的所有功能。
- 这里必须理解下,外观模式和代理模式。外观模式是一个类将其他所有类都包装好了,然后给你用。而代理模式(静态的)是一个类去代理一个基础类。相同之处时都是使用了中间类去完成功能。
- 外观模式是一对多,代理模式是一对一(一个类代理一个类)。即使是动态代理,一个类完成多个类的代理,但是也是由反射完成对应类的寻找,而不是在类中封装多个类属性,封装多个属性的,更加偏向外观模式的定义。