C# 结构型设计模式----外观模式

1、简介

外观模式,顾名思义肯定是描述外在的一种表现,在人与人之间,外观的好坏体现在各自的长相以及穿着,气质等表现,而在系统设计之间,外观则是表现在系统的接口调用,调用接口的代码越简洁,需要调用的接口越少是不是看起来和用起来更舒服?

外观模式的主要作用就是用于当有多个类(或者系统接口)要处理时,需要一个个类(或者子系统接口啥的)去调用,没有复用性和扩展性。外观模式将处理子类(或者子系统接口啥的)的过程封装成操作,简化客户端的调用过程。也将客户端与子类(或者子系统接口啥的)之间解耦。

总结就是:

外观模式(Facade)通过提供一个统一接口,来访问子系统的多个接口。

使用外观模式时,创建一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法。

外观模式让客户端与子系统之间避免紧耦合。

外观模式包含如下两个角色

(1)、外观角色(Facade) :在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。

(2)、子系统角色(SubSystem):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

优点:

外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。

外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。

缺点:

如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了"开------闭原则(当然可以结合其他设计模式去优化)。

2、适用场景

1、外一个复杂的子系统提供一个简单的接口

2、提供子系统的独立性

3、在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子。

3、实例

假设有这么一个登录流程:

在用户点击登录后,系统需要从颁发密钥的系统A获取一个Token密钥然后使用密钥到验证码系统B那里去获取用户验证码验证结果,验证通过后再带着账号密码和密钥到身份认证系统C检查账号密码,都正确就成功登录。

下面是三个系统的调用方法:

复制代码
 /// <summary>
 /// 系统A-子系统角色(SubSystem)
 /// </summary>
 public class SystemA
 {
     /// <summary>
     /// 模拟调用系统A的某个接口
     /// </summary>
     public void GetInterface()
     {
         Console.WriteLine("调用系统A的获取身份令牌Token的接口");
     }
 }
 /// <summary>
 /// 系统B-子系统角色(SubSystem)
 /// </summary>
 public class SystemB
 {
     /// <summary>
     /// 模拟调用系统B的某个接口
     /// </summary>
     public void GetInterface()
     {
         Console.WriteLine("调用系统B的获取验证码结果的接口");
     }
 }

 /// <summary>
 /// 系统C-子系统角色(SubSystem)
 /// </summary>
 public class SystemC
 {
     /// <summary>
     /// 模拟调用系统C的某个接口
     /// </summary>
     public void GetInterface()
     {
         Console.WriteLine("调用系统C的身份信息确认接口");
     }
 }

不使用外观模式实现登录

复制代码
private void WTBtn_Click(object sender, EventArgs e)
{
    Console.WriteLine("用户输入相关信息后点击登录!");
    SystemA systemA = new SystemA();
    systemA.GetInterface();//步骤1
    SystemB systemB = new SystemB();
    systemB.GetInterface();//步骤2
    SystemC systemC = new SystemC();
    systemC.GetInterface();//步骤3
    Console.WriteLine("登录成功!");
}

使用外观模式实现登录

创建外观角色(Facade)

复制代码
/// <summary>
/// 外观角色(Facade)
/// </summary>
public class Facade
{
    /// <summary>
    /// 将调用流程集成在这,三个接口变一个接口。
    /// </summary>
    public void Iintegrate()
    {
        SystemA systemA = new SystemA();
        systemA.GetInterface();//步骤1
        SystemB systemB = new SystemB();
        systemB.GetInterface();//步骤2
        SystemC systemC = new SystemC();
        systemC.GetInterface();//步骤3
    }
}

调用:

复制代码
private void WTBtn_Click(object sender, EventArgs e)
{
    Console.WriteLine("用户输入相关信息后点击登录!");
    Facade facade=new Facade();
    facade.Iintegrate();
    Console.WriteLine("登录成功!");
}

客户端调用是不是变得简单了。

看到这是不是觉得似曾相识?那你不妨将 外观角色(Facade)当作一个接口看待。只不过他是面向系统架构的接口罢了。

END...................................................................................................................

相关推荐
huang_xiaoen5 小时前
java设计模式之桥接模式(重生之我在地府当孟婆)
设计模式·桥接模式
HappyGame026 小时前
设计模式-观察者模式
观察者模式·设计模式
渊渟岳6 小时前
掌握设计模式--解释器模式
设计模式
牵牛老人16 小时前
C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·责任链模式
肥仔哥哥193017 小时前
设计模式分类与定义(高软55)
设计模式·软考·高软·设计模式分类
云徒川21 小时前
【设计模式】过滤器模式
windows·python·设计模式
找了一圈尾巴1 天前
设计模式(结构性)-代理模式
设计模式·代理模式
渊渟岳1 天前
掌握设计模式--模板方法模式
设计模式
程序员JerrySUN2 天前
设计模式 Day 2:工厂方法模式(Factory Method Pattern)详解
设计模式·工厂方法模式
牵牛老人2 天前
C++设计模式-迭代器模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·迭代器模式