当前位置: 首页 > news >正文

C#设计模式(11)——外观模式

一、概念

外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。

二、示意图

三、外观模式的实现

(1)不使用外观模式下选课系统的实现方式和客户端调用代码:

/// <summary>
    /// 不使用外观模式的情况
    /// 此时客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统
    /// 为了解决这样的问题,我们可以使用外观模式来为所有子系统设计一个统一的接口
    /// 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作
    /// 从而让客户和子系统之间避免了紧耦合
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            SubSystemA a = new SubSystemA();
            SubSystemB b = new SubSystemB();
            SubSystemC c = new SubSystemC();
            a.MethodA();
            b.MethodB();
            c.MethodC();
            Console.Read();
        }
    }

    // 子系统A
    public class SubSystemA
    {
        public void MethodA()
        {
            Console.WriteLine("执行子系统A中的方法A");
        }
    }

    // 子系统B
    public class SubSystemB
    {
        public void MethodB()
        {
            Console.WriteLine("执行子系统B中的方法B");
        }
    }

    // 子系统C
    public class SubSystemC
    {
        public void MethodC()
        {
            Console.WriteLine("执行子系统C中的方法C");
        }
    }

  (2)使用外观模式的实现:

/// <summary>
    /// 以学生选课系统为例子演示外观模式的使用
    /// 学生选课模块包括功能有:
    /// 验证选课的人数是否已满
    /// 通知用户课程选择成功与否
    /// 客户端代码
    /// </summary>
    class Student
    {
        private static RegistrationFacade facade = new RegistrationFacade();

        static void Main(string[] args)
        {
            if (facade.RegisterCourse("设计模式", "Learning Hard"))
            {
                Console.WriteLine("选课成功");
            }
            else
            {
                Console.WriteLine("选课失败");
            }

            Console.Read();
        }
    }

    // 外观类
    public class RegistrationFacade
    {
        private RegisterCourse registerCourse;
        private NotifyStudent notifyStu;
        public RegistrationFacade()
        {
            registerCourse = new RegisterCourse();
            notifyStu = new NotifyStudent();
        }

        public bool RegisterCourse(string courseName, string studentName)
        {
            if (!registerCourse.CheckAvailable(courseName))
            {
                return false;
            }

            return notifyStu.Notify(studentName);
        }
    }

    #region 子系统
    // 相当于子系统A
    public class RegisterCourse
    {
        public bool CheckAvailable(string courseName)
        {
            Console.WriteLine("正在验证课程 {0}是否人数已满", courseName);
            return true;
        }
    }

    // 相当于子系统B
    public class NotifyStudent
    {
        public bool Notify(string studentName)
        {
            Console.WriteLine("正在向{0}发生通知", studentName);
            return true;
        }
    }
    #endregion

  四、外观模式的结构

五、外观模式的优缺点:

1、优点:

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

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

2、缺点:

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

转载于:https://www.cnblogs.com/zyj649261718/p/6523444.html

相关文章:

  • flex大小写转化
  • Target runtime Apache Tomcat 5.5 is not defined
  • Android耗时操作
  • hibernate自定义主键
  • 2017.3.9 组合数学学习——组合、多重集排列
  • Flex:PopUpManager的createPopUp与addPopUp区别
  • HTTP协议返回状态码
  • sql之左连接、右连接、全连接
  • c#元组举例
  • RSA证书说明
  • JavaScript学习12 JS中定义对象的几种方式【转】
  • Flex设置toolTip样式
  • fle中alert样式的设置
  • Hdu 3065 病毒侵袭持续中(AC自动机)
  • Error #2044: 未处理的 IOErrorEvent:。 text=Error #2038: 文件 I/O 错误。
  • C++入门教程(10):for 语句
  • canvas绘制圆角头像
  • centos安装java运行环境jdk+tomcat
  • CSS实用技巧干货
  • IDEA 插件开发入门教程
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • mysql 5.6 原生Online DDL解析
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vim Clutch | 面向脚踏板编程……
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 探索 JS 中的模块化
  • 一起参Ember.js讨论、问答社区。
  • 硬币翻转问题,区间操作
  • 在Mac OS X上安装 Ruby运行环境
  • 智能网联汽车信息安全
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ###C语言程序设计-----C语言学习(6)#
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (学习日记)2024.01.09
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)Windows2003安全设置/维护
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET6实现破解Modbus poll点表配置文件
  • .NET命名规范和开发约定
  • .NET企业级应用架构设计系列之应用服务器
  • .NET运行机制
  • @ConditionalOnProperty注解使用说明
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [20150707]外部表与rowid.txt
  • [Android] Implementation vs API dependency
  • [Android]创建TabBar
  • [BIZ] - 1.金融交易系统特点
  • [C#]C#学习笔记-CIL和动态程序集