言与模式-06门面模式

来源:互联网 发布:图片文件格式软件安装 编辑:程序博客网 时间:2024/09/21 08:14

意图

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

适用性

  • 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  • 当你需要构建一个层次结构的子系统时,使用门面模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。

Java实现

public class Camara {    public void turnOn(){        System.out.println("开启摄像头!");    }    public void turnOff(){        System.out.println("关闭摄像头!");    }}
public class Light {    public void turnOn(){        System.out.println("开灯!");    }    public void turnOff(){        System.out.println("关灯!");    }}
public class Sensor {    public void activate(){        System.out.println("开启感应器!");    }    public void deactivate(){        System.out.println("关闭感应器!");    }}
public class CamaraFacade {    private Camara c1, c2;    private Light l1, l2, l3;    private Sensor s;   {        c1 = new Camara();        c2 = new Camara();        l1 = new Light();        l2 = new Light();        l3 = new Light();        s = new Sensor();    }    public void activate(){        c1.turnOn();        c2.turnOn();        l1.turnOn();        l2.turnOn();        l3.turnOn();        s.activate();    }    public void deactivate(){        c1.turnOff();        c2.turnOff();        l1.turnOff();        l2.turnOff();        l3.turnOff();        s.deactivate();    }}
public class ClientTest {    public static void main(String[] args) {        CamaraFacade facade = new CamaraFacade();        //打开        facade.activate();        //关闭        facade.deactivate();    }}

Clojure实现

函数组合轻松搞定!

(defn turn-on-camara []  (println "开启摄像头"))(defn turn-on-light []  (println "打开闪光灯"))(defn turn-on-sensor []  (println "开启感应器"))(defn turn-on-facade []  (turn-on-camara)  (turn-on-light)  (turn-on-sensor))
0 0