设计模式之门面模式(外观模式)

门面模式(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.门面模式将具体细节和调用者分离,调用者不关心内部细节实现方式,遵守迪米特法则,调用者尽可能少的知道实现功能的内部实现细节

posted @ 2020-05-07 14:48  蚂蚁style  阅读(277)  评论(0编辑  收藏  举报