结构形设计模式之 - 外观模式

828 阅读2分钟
  • 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

什么是外观模式?

外观模式(Facade) 隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。

理解外观模式

以电脑组装为例,小李是一个电脑小白,平时喜欢玩游戏,想组装一台电脑,但是大家都知道电脑由非常多的硬件组合而成,而且主板与CPU以及显卡的关联会影响电脑性能,很容易导致性能溢出或者直接影响硬件的使用寿命!

  • 出现问题

❌在程序中问题即 客户与配件关联过多即过于耦合

  • 解决

如果存在一个角色,即电脑城老板,作为客户只需要告诉老板我需要办公电脑还是游戏电脑,或者说你要什么价位的电脑,具体配置交给电脑城老板,对于客户来说就变得简单了!

✔️ 如上即是外观模式的基本概念即:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口

  • ⚠️高端CPU和低配主板,电脑也能正常使用。但是在使用的过程中,很可能由于主板的供电不足,无法保证满足CPU的正常需求。

如何使用外观模式

  • 新增几个子系统类
public class  SubClassA{
    // 每个子系统都有自己的方法
    public void SubOperationA() 
    {
        Console.WriteLine("子系统方法A");
    }
}
public class SubClassB
{
    public void SubOperationB()
    {
        Console.WriteLine("子系统方法B");
    }
}
public class SubClassC
{
    public void SubOperationC()
    {
        Console.WriteLine("子系统方法C");
    }
}
  • 关键: 创建外观类
// 外观类
public class Facade 
{
    SubClassA classA;
    SubClassB classB;
    SubClassC classC;
    // 构造函数初始化三个子系统
    public Facade() 
    {
        classA = new SubClassA();
        classB = new SubClassB();
        classC = new SubClassC();
    }
    // 操作逻辑方法A
    public void OperationA() 
    {
        Console.WriteLine("执行方法A -------");
        classA.SubOperation();
        classB.SubOperation();
        classC.SubOperation();
    }
    //  操作逻辑方法B
    public void OperationB()
    {
        Console.WriteLine("执行方法B -------");
        classB.SubOperation();
        classC.SubOperation();
    }
}
  • 调用

image.png

总结 🍑

何时使用外观模式?

  • 子系统通复杂,可使用外观模式。提供一个简单的接口,减少子系统之间的依赖
  • 系统设计初期,如使用分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系
  • 项目难以维护,可以使用外观模式,用外观类去交互复杂的子系统逻辑。

优点:减少了系统依赖,提高了灵活性
缺点:外观类关联太多复杂子系统类耦合度太高,并且扩展子系统需要修改相关联的外观类,不符合开闭原则。