目录
0、定义
为系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
1、外观模式的两种角色
- 子系统(Subsystem):子系统是若干个类的集合,这些类的实例协同合作为用户提供所需要的功能,子系统中的任何类都不包含外观类的实例引用。
- 外观(Facade):外观是一个类,该类包含子系统中全部或部分类的实例引用,当用户想要和子系统中的若干个类的实例打交道时,可以代替地和子系统的外观类的实例打交道。
2、外观模式的UML类图
3、示例代码
子系统
package xyz.jangle.design.facade;
public class ClassA {
public void doSomeThing() {
System.out.println("ClassA:to do some thing");
}
}
package xyz.jangle.design.facade;
public class ClassB {
public void doSomeThing() {
System.out.println("ClassB:to do some thing");
}
}
package xyz.jangle.design.facade;
public class ClassC {
public void doSomeThing() {
System.out.println("ClassC:to do some thing");
}
}
package xyz.jangle.design.facade;
public class ClassD {
public void doSomeThing() {
System.out.println("ClassD:to do some thing");
}
}
外观
package xyz.jangle.design.facade;
/**
* 外观类,委托子系统调用相关方法
* @author Administrator
*
*/
public class Facade {
private ClassA classA;
private ClassB classB;
private ClassC classC;
private ClassD classD;
public Facade(ClassA classA, ClassB classB, ClassC classC, ClassD classD) {
super();
this.classA = classA;
this.classB = classB;
this.classC = classC;
this.classD = classD;
}
/**
* 外观调用全部子系统执行相关的方法,完成业务需求。
*/
public void todoSomething() {
classA.doSomeThing();
classB.doSomeThing();
classC.doSomeThing();
classD.doSomeThing();
}
/**
* 外观调用部分子系统的相关方法,完成业务需求。
*/
public void todoSomething2() {
classA.doSomeThing();
classD.doSomeThing();
}
}
客户端(使用)
package xyz.jangle.design.facade;
public class AppMain10 {
public static void main(String[] args) {
Facade facade = new Facade(new ClassA(), new ClassB(), new ClassC(), new ClassD());
facade.todoSomething();
System.out.println("-------------");
facade.todoSomething2();
}
}
输出结果:
ClassA:to do some thing
ClassB:to do some thing
ClassC:to do some thing
ClassD:to do some thing
-------------
ClassA:to do some thing
ClassD:to do some thing