外观模式(门面模式):
1.外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了 一个高层接口,这个接口使得这一子系统更加容易使用。
2.外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无 需关心这个子系统的内部细节。
成员:
1) 外观类(Facade): 为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代 理给适当子系统对象
2) 调用者(Client): 外观接口的调用者
3) 子系统的集合:指模块或者子系统,处理 Facade 对象指派的任务,他是功能的实际提供者
优点:
(1)实现了子系统与客户端之间的松耦合关系。
(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
缺点:不符合开不原则,修改很麻烦
在以下情况下可以考虑使用外观模式:
(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
(2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
(3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
系统层次化,利于维护和优化。
案例:
package facade.demo;
/**
* 外观接口
*/
public class Facade {
/**
* 各个子系统
*/
private Active active;
private OneSystem oneSystem;
private TwoSystem twoSystem;
private Subject subject;
public Facade() {
super();
this.active = Active.getInstance();
this.oneSystem = OneSystem.getInstance();
this.twoSystem = TwoSystem.getInstance();
this.subject = Subject.getInstance();
}
public void start() {
active.on();
oneSystem.on();
twoSystem.on();
subject.on();
}
public void stop() {
active.off();
oneSystem.off();
twoSystem.off();
subject.off();
}
public static void main(String[] args) {
Facade facade = new Facade();
facade.start();
facade.stop();
}
}
子系统:
package facade.demo;
public class Active {
private static Active active = new Active();
public static Active getInstance() {
return active;
}
public void on() {
System.out.println("Active on");
}
public void off() {
System.out.println("Active off");
}
}
package facade.demo;
public class OneSystem {
private static OneSystem active = new OneSystem();
public static OneSystem getInstance() {
return active;
}
public void on() {
System.out.println("OneSystem on");
}
public void off() {
System.out.println("OneSystem off");
}
}
package facade.demo;
public class Subject {
private static Subject active = new Subject();
public static Subject getInstance() {
return active;
}
public void on() {
System.out.println("Subject on");
}
public void off() {
System.out.println("Subject off");
}
}
package facade.demo;
public class TwoSystem {
private static TwoSystem active = new TwoSystem();
public static TwoSystem getInstance() {
return active;
}
public void on() {
System.out.println("TwoSystem on");
}
public void off() {
System.out.println("TwoSystem off");
}
}