重点内容
1.什么是门面模式
2.门面结构类图
3.门面模式使用场景

先说门面模式属于结构型模式中设计模式,主要解决对象组成和对象之间的依赖关系。

门面模式:外部与子系统进行通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。

2.门面模式结构:

23中设计模式之门面模式_设计模式

很直观,想和子系统内部模块A,B,C.通信必须通过Facade对象来建立联系

eg:例子

23中设计模式之门面模式_ide_02

package Facade;

//挂号、门诊、划价、化验、收费、取药
public interface Hospital {

void Guahao();

void menzhen();

void huajia();

void huayan();

void shoufei();

void quyao();

}

实现类

package Facade;

/**
* 实现类
*
* @author weichyang
*
*/
public class ImlHospital implements Hospital {

@Override
public void Guahao() {

System.out.println("去挂号!");

}

@Override
public void menzhen() {
System.out.println("去门诊!");

}

@Override
public void huajia() {
System.out.println("去划价!");

}

@Override
public void huayan() {
System.out.println("去化验!");

}

@Override
public void shoufei() {
System.out.println("去挂号!");

}

@Override
public void quyao() {
System.out.println("去取药!\n");

System.out.println("-----------------流程结束-------------");
}

}

客户端

package Facade;

/*
* 病人取药
*/

public class Client {

/**
* @param args
* //挂号、门诊、划价、化验、收费、取药
*/
public static void main(String[] args) {

Hospital hospital = new ImlHospital();
hospital.Guahao();
hospital.menzhen();
hospital.huajia();
hospital.huayan();
hospital.shoufei();
hospital.quyao();

}

}

Ok 这是进行会这样做的。这样写有什么问题。代码高度耦合在一起。Client 必须知道整个流程,缺少一环就取不到要。那么怎么优化呢,引入门面模式。修改下类图,增加一个Facade类作为两者中间的委托对象。

23中设计模式之门面模式_门面模式_03

增加一个facade。然后对整个过程进行封装。在不改变其他类同时,完成了扩展。

package Facade;

/**
* 暂且称为接待员
*
* @author weichyang
*
*/
public class FacadeOb {

private ImlHospital hospital = new ImlHospital();

/**
* 患者看病
*/
public void kanbing() {
hospital.Guahao();
hospital.menzhen();
hospital.huajia();
hospital.huayan();
hospital.shoufei();
hospital.quyao();

}

}

看Client类是不是很简单

package Facade;

/*
* 病人取药
*/

public class Client {

/**
* @param args
* //挂号、门诊、划价、化验、收费、取药
*/
public static void main(String[] args) {

// Hospital hospital = new ImlHospital();
// hospital.Guahao();
// hospital.menzhen();
// hospital.huajia();
// hospital.huayan();
// hospital.shoufei();
// hospital.quyao();

FacadeOb fOb = new FacadeOb();
fOb.kanbing();

}

}

好了。这就是门面模式简版。扩展性,维护成本都减少很多,想深入理解。可以看看okhttp 源码。