外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。
如何解决:客户端不与系统耦合,外观类与系统耦合。
关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。
优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。
注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。
1.创建不同的worker代表不同的子类系统
package com.zqr.design.facadePattern;
public class Worker_01 {
public void work() {
System.out.println("第一个工人,工作.....");
}
public void rest() {
System.out.println("第一个工人,休息.....");
}
}
package com.zqr.design.facadePattern;
public class Worker_02 {
public void work() {
System.out.println("第二个工人,工作.....");
}
public void rest() {
System.out.println("第二个工人,休息.....");
}
}
package com.zqr.design.facadePattern;
public class Worker_03 {
public void work() {
System.out.println("第三个工人,工作.....");
}
public void rest() {
System.out.println("第三个工人,休息.....");
}
}
2.创建包工头Contractor代表外观类,为客户端提供可见接口
package com.zqr.design.facadePattern;
/**
* 外观类:统一封装子类方法/接口,为客户端提供可调用接口.具体实现对客户端不可见
* @ClassName: Contractor
*/
public class Contractor {
private Worker_01 wk1;
private Worker_02 wk2;
private Worker_03 wk3;
public Contractor() {
if (null == wk1) {
wk1 = new Worker_01();
}
if (null == wk2) {
wk2 = new Worker_02();
}
if (null == wk3) {
wk3 = new Worker_03();
}
}
public void work() {
wk1.work();
wk2.work();
wk3.work();
}
public void rest() {
wk1.rest();
wk2.rest();
wk3.rest();
}
}
3.Test