Java设计模式笔记之门面模式

1.门面模式(Facade)

门面模式是对象的结构模式。外部与一个子系统的通信必须通过一个统一门面(Facade)对象进行通信。门面对象通过对子系统功能的整理,给外界提供一个更高层,更简洁的接口。

2.门面模式结构

门面模式适合比较复杂大型的功能系统,一般描述的是子系统(功能模块)之间的关系,下面是用协作图来描述的门面模式。


从上述协作图可以看出,门面中只有两种角色:门面角色(Facade)和子系统(SubSystem)

(1)Facade:客户端可以调用这个角色的方法。通过此角色与多个子系统通信。可以有一个或者多个。

(2)SubSystem:系统的子系统,一个代表一个功能模块。对于子系统而言,门面也是一种客户端。


3.什么情况下使用门面模式

(1)为一个复杂子系统提供一个简单接口。

(2)引入门面模式,使得子系统与客户端或者其它子系统分离,提高子系统的独立性和可移植性。

(3)在构建一个层次化的系统时,可以使用Facade模式定义系统中每一层的入口,简化层与层之间的依赖关系


4.一个例子

一个保安系统,由录像机、电灯、遥控器和警报器组成。操作人员经常需要开关这些装置。如果直接在客户端操作这些装置,客户端与这些装置的依赖变大,并且因为操作繁琐,可能会出现错误操作。

所以需要引入一个门面对象,将子系统的功能整理好,提供一个可服用的,简洁的接口。



从图中可以看出,系统有2个Camera、3个light(灯)、一个Sensor(摄像头)和一个alarm(警报),如果让client直接操作,比如开启所有装置,不光依赖严重,而且可维护性差。

源码:

SecurityFacade.java

package com.patterns.facade;

public class SecurityFacade
{
	
	public static SecurityFacade  me = new SecurityFacade();
	
	private SecurityFacade(){};
	/**
	 * 单例创建Facade
	 * @return
	 */
	public static SecurityFacade getInstance(){
		return me;
	}
    
    private Camera camera1 = new Camera(), camera2 = new Camera();

    
    private Light light1 = new Light(), light2 = new Light(), light3 = new Light();

    
    private Sensor sensor = new Sensor();

   
    private Alarm alarm = new Alarm();

    /**
     * 开启系统所有装置
     */
    public void activate()
    {
		camera1.turnOn();
		camera2.turnOn();

        light1.turnOn();
        light2.turnOn();
        light3.turnOn();

        sensor.activate();
        alarm.activate();
    }

    public void deactivate()
    {
		camera1.turnOff();
		camera2.turnOff();

        light1.turnOff();
        light2.turnOff();
        light3.turnOff();

        sensor.deactivate();
        alarm.deactivate();
    }

}

Camera.java

package com.patterns.facade;

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

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

    public void rotate(int degrees)
    {
		System.out.println("Rotating the camera by " + degrees + " degrees.");
    }
}

Light.java

package com.patterns.facade;

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

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

    public void changeBulb()
    {
		System.out.println("Changing the light-bulb.");
    }
}

Sensor.java

package com.patterns.facade;

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

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

    public void trigger()
    {
		System.out.println("The sensor has been triggered.");
    }
}

Alarm.java

package com.patterns.facade;

public class Alarm
{
    public void activate()
    {
		System.out.println("Activating the alarm.");
    }

    public void deactivate()
    {
		System.out.println("Deactivating the alarm.");
    }

    public void ring()
    {
		System.out.println("Ring the alarm.");
    }

    public void stopRing()
    {
		System.out.println("Stop the alarm.");
    }
}

Client.,java

package com.patterns.facade;

public class Client
{
   
    private static SecurityFacade security ;

    public static void main(String[] args)
    {
    	security = SecurityFacade.getInstance();
		security.activate();
    }
}


运行结果:

Turning on the camera.
Turning on the camera.
Turning on the light.
Turning on the light.
Turning on the light.
Activating on the sensor.
Activating the alarm.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值