23中设计模式之门面模式
原创
©著作权归作者所有:来自51CTO博客作者灯塔kuaidao的原创作品,请联系作者获取转载授权,否则将追究法律责任
重点内容
1.什么是门面模式
2.门面结构类图
3.门面模式使用场景
先说门面模式属于结构型模式中设计模式,主要解决对象组成和对象之间的依赖关系。
门面模式:外部与子系统进行通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。
2.门面模式结构:
很直观,想和子系统内部模块A,B,C.通信必须通过Facade对象来建立联系
eg:例子
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类作为两者中间的委托对象。
增加一个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 源码。