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.





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值