如医院的就诊的情况(医院—子系统,外观—导医)
客户端程序与完成实际业务功能的子系统程序之间通信时采用的2种方案:
子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
——《设计模式》GoF
外观模式是对象的结构模式。外观模式没有一个一般化的类图描述,下图演示了一个外观模式的示意性对象图:
这种结构不仅体现了类的单一职责原则,而且也体现了开放/封闭原则。子系统和系统之间是组合关系,而不是继承关系。高层总是相对稳定,低层总是相对易变。所以我们应该尽量依赖高层抽象,而不是低层细节实现。
保安系统:由两个录像机、三个电灯、一个遥感器和一个警报器组成,保安系统的操作人员需要经常将这些仪器启动和关闭。
示例:SecurityClassical(未用外观模式的代码,耦合非常大)
using System;
using System.Collections.Generic;
using System.Text;
namespace SecurityClassical
{
class Program
{
static void Main(string[] args)
{
//客户端程序需要面临众多的子系统内部的类,以及众多的子系统内部的对象
Camera camera1, camera2;
Light light1, light2, light3;
Sensor sensor;
Alarm alarm;
//客户端程序直接创建子系统内部的类的对象
camera1 = new Camera();
camera2 = new Camera();
light1 = new Light();
light2 = new Light();
light3 = new Light();
sensor = new Sensor();
alarm = new Alarm();
//客户端程序直接调用子系统内部的类的方法--启动
camera1.TurnOn();
camera2.TurnOn();
light1.TurnOn();
light2.TurnOn();
light3.TurnOn();
sensor.Activate();
alarm.Activate();
alarm.Ring();
Console.WriteLine();
Console.WriteLine("Other Operations...");
Console.WriteLine();
//客户端程序直接调用子系统内部的类的方法--关闭
camera1.TurnOff();
camera2.TurnOff();
light1.TurnOff();
light2.TurnOff();
light3.TurnOff();
sensor.Deactivate();
alarm.StopRing();
alarm.Deactivate();
Console.Read();
//以上代码使客户端程序与子系统耦合极大
}
}
}
示例: SecurityFacade(使用外观模式)
using System;
using System.Collections.Generic;
using System.Text;
namespace SecurityFacade
{
/// <summary>
/// 外观类
/// </summary>
public class Facade
{
//内部封装了子系统的对象
private Camera camera1, camera2;
private Light light1, light2, light3;
private Sensor sensor;
private Alarm alarm;
public Facade()
{
//子系统的对象由外观类创建
camera1 = new Camera();
camera2 = new Camera();
light1 = new Light();
light2 = new Light();
light3 = new Light();
sensor = new Sensor();
alarm = new Alarm();
}
//对子系统中对象操作的封装--启动
public void Activate()
{
camera1.TurnOn();
camera2.TurnOn();
light1.TurnOn();
light2.TurnOn();
light3.TurnOn();
sensor.Activate();
alarm.Activate();
alarm.Ring();
}
//对子系统中对象操作的封装--关闭
public void Deactivate()
{
camera1.TurnOff();
camera2.TurnOff();
light1.TurnOff();
light2.TurnOff();
light3.TurnOff();
sensor.Deactivate();
alarm.Deactivate();
alarm.StopRing();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace SecurityFacade
{
class Program
{
static void Main(string[] args)
{
Facade security = new Facade();
//通过外观对象访问子系统,避免与子系统过多耦合
security.Activate();
Console.WriteLine();
Console.WriteLine("Other Operations...");
Console.WriteLine();
security.Deactivate();
Console.Read();
}
}
}
本文地址:https://blog.csdn.net/qq_41342326/article/details/107500235
如对本文有疑问, 点击进行留言回复!!
网友评论