概述
外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端可以通过简单的接口与子系统进行交互。
外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
外观模式中的角色:
1 外观类(Facade):在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
2 子系统类集合(SubSystem Classes):子系统类集合实现了子系统的功能,处理外观类对象指派的任务。
外观模式的优缺点:
优点:
外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
缺点:
如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。
结构图如下:
代码
新建一个控制台项目,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 外观模式
{// 客户端代码class Client{static void Main(string[] args){Facade facade = new Facade();facade.Operation();Console.ReadKey();}}// 外观类class Facade{private SubsystemA subsystemA;private SubsystemB subsystemB;public Facade(){subsystemA = new SubsystemA();subsystemB = new SubsystemB();}public void Operation(){subsystemA.OperationA();subsystemB.OperationB();}}// 子系统类Aclass SubsystemA{public void OperationA(){Console.WriteLine("SubsystemA: OperationA");}}// 子系统类Bclass SubsystemB{public void OperationB(){Console.WriteLine("SubsystemB: OperationB");}}
}
运行:
从上面的代码来看,外观模式实现起来也非常的简单,只是将两个子系统放到一个类中实例化,在其他类调用就好了。
那就随便写一个案例吧,一个屋主,养了两条狗,有一天在家里,突然发现院子里有个小偷,于是屋主就开门放狗,咬向了两个小偷,就用外观模式来实现这个功能。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 外观模式
{internal class Program{static void Main(string[] args){People.SeeingThief();Console.ReadKey();}}public class Dog{//名字public string Name { get; set; }//种类public string Types { get; set; }public virtual void Bite() { }}public class DogA : Dog{public override void Bite(){Console.WriteLine("{0}{1} 狂吠不止,向门外冲去",Types, Name);}}public class DogB : Dog{public override void Bite(){Console.WriteLine("{0}{1} 张开血盆大口,一跃而起", Types, Name);}}public class Home{public DogA dogA;public DogB dogB;public void OpenTheDoor(){dogA.Bite();dogB.Bite();}public Home(){dogA = new DogA() { Name = "大黄", Types = "土狗" };dogB = new DogB() { Name = "黑背", Types = "德牧" };}}public class People{//看见小偷public static void SeeingThief(){Console.WriteLine("屋主:哇!有小偷!!!");Console.WriteLine("屋主:开门放狗");Home home = new Home();home.OpenTheDoor(); }private People() { }}
}
运行:
这个多态感觉没用上,在外观模式中,本来也没有用到多态,就这样吧。
end