外观模式(Facade)

一、模式动机

将一个系统划分为若干个子系统有利于降低系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统中较一般的设置提供了一个单一而简单的界面。

外观模式要求一个子系统的外部与其内部的通信必须通过一个统一的外观(Facade)对象进行。就如同医院的接待员一样,外观模式的外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。

二、模式定义

外观模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是对象的结构模式。

三、模式结构

外观模式

四、参与者

  • Facade:外观角色
  • SubSystem:子系统角色

五、示例代码

一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。

package design.pattern;

class Camera {
    public void turnOn() {
        System.out.println("turning on the camera.");
    }

    public void turnOff() {
        System.out.println("turning off the camera.");
    }
}

class Light {
    public void turnOn() {
        System.out.println("turning on the light.");
    }

    public void turnOff() {
        System.out.println("turning off the light.");
    }
}

class Sensor {
    public void activate() {
        System.out.println("activating the sensor.");
    }

    public void deactivate() {
        System.out.println("deactivating the sensor.");
    }
}

public class Facade {

    private Camera camera1, camera2;
    private Light light1, light2;
    private Sensor sensor;

    Facade() {
        camera1 = new Camera();
        camera2 = new Camera();
        light1 = new Light();
        light2 = new Light();
        sensor = new Sensor();
    }

    public void activate() {
        camera1.turnOn();
        camera2.turnOn();
        light1.turnOn();
        light2.turnOff();
        sensor.activate();
    }

    public void deactivate() {
        camera1.turnOff();
        camera2.turnOff();
        light1.turnOff();
        light2.turnOff();
        sensor.deactivate();
    }

    public static void main(String[] args) {
        Facade f = new Facade();
        f.activate();
        System.out.println();
        f.deactivate();
    }

}
  • 模式结构
    外观模式

  • 优缺点

    • 它对客户屏蔽子系统组件,减少了客户处理的对象数目使得子系统使用起来更加容易。
    • 它实现了子系统与客户之间的松耦合关系。这使得子系统的组件变化不会影响到它的客户。
    • 提高了安全性,通过外观模式,屏蔽子系统业务逻辑。
    • 它简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其它的子系统。
    • 它并不限制复杂应用使用子系统类。
    • 外观模式并不增加任何功能性模式,它仅仅是一些简单化接口。
  • 模式使用

    • 当要为一个复杂子系统提供一个简单接口时。这个接口对大多数用户来说已经足够好;那些需要更多可定制性的用户可以越过Facade层。
    • 子系统相对独立——外界只需黑箱操作即可。例如利息计算。
    • 预防操作人员带来的风险扩散。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值