1.外观模式介绍
外观模式也被叫做门面模式,这种模式的作用是:隐藏系统的复杂性,并向客户端提供了一个可以访问系统的统一接口,这个统一的接口组合了子系统的多个接口。使用统一的接口使得子系统更容易被访问或者使用。 以去医院看病为例,去医院看病时可能要去挂号、门诊、划价、取药等,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。我们先了解下外观模式的三种角色:
子系统角色:实现了各种子功能,子系统之间可以相互交户,也可以提供给客户端直接调用的接口。
门面角色:熟悉子系统的功能,可以把子系统的功能组合在一起然后提供一个统一的接口供客户端调用。
客户端角色:调用Facede来实现要完成的功能。
下边使用网友的电脑开关机的例子(链接:java设计模式之外观模式(门面模式))介绍外观模式的用法:每台电脑都有CPU,Memory,Disk。我们开关电脑时不会一个一个地打开或关闭各个部件,而是通过一个统一的开关机按钮一次性打开各个部件。通过外观模式可以实现用户的与部件间的解耦。
子系统(cpu,memory,disk)代码:
/// <summary> /// CPU子系统 /// </summary> public class CPU { public void CPUStart() { Console.WriteLine("CPU is start..."); } public void CPUShutdown() { Console.WriteLine("CPU is shot down..."); } } /// <summary> /// 内存子系统 /// </summary> public class Memory { public void MemoryStart() { Console.WriteLine("Memory is start..."); } public void MemoryShutdown() { Console.WriteLine("Memory is shot down..."); } } /// <summary> /// 硬盘子系统 /// </summary> public class Disk { public void DiskStart() { Console.WriteLine("Disk is start..."); } public void DiskShutdown() { Console.WriteLine("Disk is shot down..."); } }
门面类(Computer)代码:
/// <summary> /// 电脑 facede角色 /// </summary> public class Computer { private CPU cpu; private Memory memory; private Disk disk; public Computer() { this.cpu = new CPU(); this.memory = new Memory(); this.disk = new Disk(); } public void Start() { cpu.CPUStart(); memory.MemoryStart(); disk.DiskStart(); Console.WriteLine("computer start end!"); } public void Shutdown() { cpu.CPUShutdown(); memory.MemoryShutdown(); disk.DiskShutdown(); Console.WriteLine("computer shutdown end!"); } }
客户端调用:
class Program { static void Main(string[] args) { Computer computer = new Computer(); //开机 computer.Start(); Console.WriteLine(); //关机 computer.Shutdown(); Console.ReadKey(); } }
程序运行结果:
2.小结
外观模式的使用:
外观模式在我们的开发中使用的比较频繁,以三层架构为例:
子系统角色:Dal层,负责数据访问,比如有UserDal和RoleDal,UserDal返回的数据格式为[名字:张三,角色ID:3],RoleDal层返回的数据格式[角色ID:3,角色名:管理员]
门面角色:Bll层,负责具体业务(汇总子系统的功能,这里使用UserDal和RoleDal两个子系统角色的功能),返回的数据格式[名字:张三 ,角色名:管理员]
客户端角色:UI层,通过Bll层直接拿到格式如[名字:张三 ,角色名:管理员]的数据。
外观模式的优点:
1.隐藏了系统的复杂性,让客户端使用系统功能时变很简单;
2.实现客户端和子系统间的解耦。
外观模式的缺点:
1.不符合开闭原则,如客户端要使用更多功能时,不仅仅在子系统进行添加或修改操作,也必须修改门面层。