门面模式(Facade),别名"外观模式",门面模式为子系统中的一组接口提供了一致的门面(也就是软件的入口),此模式定义了一个高层接口,这个接口使得这一个子系统更加容易使用.
门面模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用者只需跟这个接口发生调用,而无需关心这个子系统的内部细节.
角色:
Facade(门面类):为调用者提供统一的调用接口,门面类知道哪些子系统负责处理请求并完成相关的请求处理,从而将调用者的请求转交给适当子系统对象去完成.
Client(调用者):门面模式的调用者
SubSystemList:(子系统的集合)也就是门面接口实现类的成员变量:指模块或者子系统,去实际处理Facade对象指派的任务,功能的实际提供者
Demo案例:
假设现有一个病人去医院看病,需要完成四项功能 挂号 门诊 划价 取药,如果病人单独去完成这些,需要四个步骤,过于繁琐,我们可以通过门面模式去实现病人和四个部分的解耦合
SubSystemList:(子系统的集合)
public class Register { public void register() { System.out.println("挂号完成"); } }
public class OutpatientDepartment { public void check() { System.out.println("门诊完毕"); } }
public class Pricing { public void pricing() { System.out.println("划价完毕"); } }
public class Pharmacy { public void takeMedicine() { System.out.println("取药完毕"); } }
Facade(门面类)
public class Facade { //示意方法,满足客户端需要的功能 public void service(){ Register a = new Register(); a.register(); OutpatientDepartment b = new OutpatientDepartment(); b.check(); Pricing c = new Pricing(); c.pricing(); Pharmacy d = new Pharmacy(); d.takeMedicine(); } }
Client(调用者)
public class Client { public static void main(String[] args) { Facade facade = new Facade(); facade.service(); } }
此刻就是一个简单的门面模式,无需知道子系统集合的具体实现细节,只需调用门面类去完成所需功能即可,提供一个统一门面.
总结:
1.门面模式对外屏蔽了子系统的细节,因此门面模式降低了客户端对子系统使用的复杂性
2.门面模式对客户端与子系统的直接耦合关系进行了解耦,让子系统内部的模块更易于维护和扩展.
3:通过合理的使用门面模式,可以帮助我们更好的划分访问的层次,形成合理的层次结构,特别是在分层模块化架构的时候,就应该使用门面模式
4:在维护一个遗留的大型系统是,可能这个系统已经变得非常难以维护和扩展,可以考虑为新系统开发一个Facade类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高代码复用性,
5.不能过度使用门面模式,需要合理设计
6.门面模式将具体细节和调用者分离,调用者不关心内部细节实现方式,遵守迪米特法则,调用者尽可能少的知道实现功能的内部实现细节