Fork me on GitHub

设计模式-外观模式(12)

定义

  外观模式(Facade Pattern)也叫门面模式,是一种比较常用同时也非常简单的设计模式。英文原话是:Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.意思是:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易使用。

  外观模式注重“统一的对象”,即提供一个访问子系统的接口,只有通过该接口(Facade)才能允许访问子系统的行为发生.

  外观模式有两种角色:

  外观(Facade)角色:客户端可以调用该角色的方法,该角色知晓相关子系统的功能和责任。正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,即该角色没有实际的业务逻辑,只是一个委托类。

  子系统(Subsystem)角色:可以同时存在一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合。子系统不知道外观角色的存在,对于子系统而言,外观角色仅仅是另一个客户端而已。

/**
 * 子系统集合中的类A
 * 子系统是一个集合
 */
public class ClassA {
    public void methodA(){
        System.out.println("ClassA的方法A");
    }
}
/**
 * 子系统集合中的类B
 * 子系统是一个集合
 */
public class ClassB {
    public void methodB(){
        System.out.println("ClassB的方法B");
    }
}
/**
 * 子系统集合中的类C
 * 子系统是一个集合
 */
public class ClassC {
    public void methodC(){
        System.out.println("ClassC的方法C");
    }
}


/**
 * 外观角色
 * 对于子系统的访问需要通过外观角色进行
 */
public class Facade {
    //被委托的对象
    private ClassA a = new ClassA();
    private ClassB b = new ClassB();
    private ClassC c = new ClassC();
    
    public void methodA(){
        a.methodA();
    }
    
    public void methodB(){
        b.methodB();
    }
    
    public void methodC(){
        c.methodC();
    }
}


//调用
public static void main(String[] args) {
        Facade facade = new Facade();
        facade.methodA();
        facade.methodB();
        facade.methodC();
}

源码

//子系统角色-机场
public class Airport {
    public void bookTicket(String from,String to){
        System.out.println("订购了从"+from+"到"+to+"的机票");
    }
}
//子系统角色-酒店
public class Hotel {
    public void bookRook(int days){
        System.out.println("订了"+days+"天的房间");
    }
}
//子系统角色-司机
public class Chauffeur {
    public void drive(String to){
        System.out.println("司机开车去"+to);
    }
}


//秘书-外观角色
public class Secretary {
    private Chauffeur chauffeur = new Chauffeur();
    private Hotel hotel = new Hotel();
    private Airport airport = new Airport();
    //安排出差
    public void travel(String to,int days){
        airport.bookTicket("扬州", to);
        chauffeur.drive("泰州机场");
        hotel.bookRook(days);
    }
}

//老板调用外观角色(秘书)
public class Boss {
    public static void main(String[] args) {
        Secretary secretary = new Secretary();
        System.out.println("老板告诉秘书要到美国出差10天");
        secretary.travel("美国", 10);
    }
}

外观模式的优点

  减少系统 的相互依赖关系。所有的依赖都是对Facade对象的依赖,与子系统无关。

  提高灵活性。不管子系统内部如何变化,只要不影响Facade对象,任何活动都是自由的。

  提高安全性。在Facade中未提供的方法,外界就无法访问,提高了系统的安全性。

  (外观模式最大的缺点是不符合开闭原则。开闭原则:对修改关闭,对扩展开放。)

外观模式的使用场景

  为一个复杂的模块或子系统提供一个供外界访问的接口。

  子系统相对独立,外界对子系统的访问只需要黑箱操作即可。

  预防风险扩散,使用Facade进行访问操作控制。

posted @ 2018-01-09 07:45  秋夜雨巷  阅读(224)  评论(0编辑  收藏  举报