1. 意图(Intent)
提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。
2. 类图(Class Diagram)
3. 实现(Implementation)
I 画图案例
首先,我们定义一个接口:
public interface Shape {void draw();}
定义几个实现类:
圆形类
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Circle::draw()");}}
长方形类
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Rectangle::draw()");}}
客户端调用:
public class Client {public static void main(String[] args) {// 画一个圆形Shape circle = new Circle();circle.draw();// 画一个长方形Shape rectangle = new Rectangle();rectangle.draw();}}
以上是我们常写的代码,我们需要画圆就要先实例化圆,画长方形就需要先实例化一个长方形,然后再调用相应的 draw() 方法。
下面,我们看看怎么用门面模式来让客户端调用更加友好一些。
我们先定义一个门面:
public class ShapeMakerFacade {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 Client {public static void main(String[] args) {ShapeMakerFacade shapeMaker = new ShapeMakerFacade();// 客户端调用现在更加清晰了shapeMaker.drawCircle();shapeMaker.drawRectangle();shapeMaker.drawSquare();}}
门面模式的优点显而易见,客户端不再需要关注实例化时应该使用哪个实现类,直接调用门面提供的方法就可以了,因为门面类提供的方法的方法名对于客户端来说已经很友好了。
II 看电影案例
观看电影需要操作很多电器,使用外观模式实现一键看电影功能。
public class SubSystem {
public void turnOnTV() {
System.out.println("turnOnTV()");
}
public void setCD(String cd) {
System.out.println("setCD( " + cd + " )");
}
public void startWatching(){
System.out.println("startWatching()");
}
}
public class Facade {
private SubSystem subSystem = new SubSystem();
//门面帮你制定好操作,用户傻瓜式启动即可
public void watchMovie() {
subSystem.turnOnTV();
subSystem.setCD("a movie");
subSystem.startWatching();
}
}
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.watchMovie();
}
}
4. 设计原则
最少知识原则:只和你的密友谈话。也就是说客户对象所需要交互的对象应当尽可能少。
