C# 外观模式

概述

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端可以通过简单的接口与子系统进行交互。

外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。

外观模式中的角色:

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

2 子系统类集合(SubSystem Classes):子系统类集合实现了子系统的功能,处理外观类对象指派的任务。

外观模式的优缺点:

优点:

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

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

缺点:

如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了"开------闭原则"(不过这点也是不可避免)。

结构图如下:

代码

新建一个控制台项目,代码如下:

cs 复制代码
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();
        }
    }

    // 子系统类A
    class SubsystemA
    {
        public void OperationA()
        {
            Console.WriteLine("SubsystemA: OperationA");
        }
    }

    // 子系统类B
    class SubsystemB
    {
        public void OperationB()
        {
            Console.WriteLine("SubsystemB: OperationB");
        }
    }
}

运行:

从上面的代码来看,外观模式实现起来也非常的简单,只是将两个子系统放到一个类中实例化,在其他类调用就好了。

那就随便写一个案例吧,一个屋主,养了两条狗,有一天在家里,突然发现院子里有个小偷,于是屋主就开门放狗,咬向了两个小偷,就用外观模式来实现这个功能。

代码:

cs 复制代码
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

相关推荐
小码编匠30 分钟前
C# 实现西门子S7系列 PLC 数据管理工具
后端·c#·.net
“抚琴”的人20 小时前
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
c#·工业相机·visionpro·机械视觉
FAREWELL000751 天前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法
CodeCraft Studio1 天前
Excel处理控件Spire.XLS系列教程:C# 合并、或取消合并 Excel 单元格
前端·c#·excel
勘察加熊人1 天前
forms实现连连看
c#
hvinsion1 天前
PPT助手:一款集计时、远程控制与多屏切换于一身的PPT辅助工具
c#·powerpoint·ppt·ppt助手·ppt翻页
weixin_307779131 天前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
时光追逐者1 天前
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
开发语言·javascript·信息可视化·c#·.net·blazor
与火星的孩子对话1 天前
Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发
人工智能·unity·c#·游戏引擎·语音识别·宠物
response_L1 天前
国产系统统信uos和麒麟v10在线打开word给表格赋值
java·c#·word·信创·在线编辑