zoukankan      html  css  js  c++  java
  • C#设计模式——外观模式

    一、外观模式介绍:

    外观模式为子系统的一组接口提供一个统一的接口。外观定义了一个高层接口,使得子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合,并且外观模式可以解决层结构分离、降低系统耦合度和为新旧系统交互提供接口功能。外观模式也称作 ”门面“模式。

    二、出现背景:

    在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,为了将复杂系统的内部子系统与客户端之间的依赖解耦,就有了外观模式。

    三、设计例子:

    以笔记本的生产和销售为例,在笔记本产业链系统中,笔记本仓库为一个子系统,笔记本的销售为另一个子系统,当采购员请购一定数量时,我们需要确认库存是否满足才会完成交易,库存不足需要和采购员交互提示相应信息。

    四、相关代码:

    1、创建各子系统类,定义各自方法:

        /// <summary>
        /// 笔记本仓库子系统
        /// </summary>
        public class NoteBookFactory
        {
            /// <summary>
            /// 验证库存是否满足请购数
            /// </summary>
            /// <param name="qty"></param>
            /// <returns></returns>
            public bool CheckStock(int qty)
            {
                if (qty > 100)
                {
                    return false;
                }
                return true;
            }
        }
        /// <summary>
        /// 销售笔记本子系统
        /// </summary>
        public class SellingNoteBook
        {
            /// <summary>
            /// 销售确认库存不足后提示信息
            /// </summary>
            /// <param name="notename"></param>
            /// <returns></returns>
            public bool Notify(string notename)
            {
                Console.WriteLine("{0}库存不足", notename);
                return false;
            }
        }

    2、创建外观类,提供统一接口:

        /// <summary>
        /// 外观类
        /// </summary>
        public class Facade
        {
            private NoteBookFactory production_note_book;
            private SellingNoteBook selling_note_book;
    
            public Facade()
            {
                production_note_book = new NoteBookFactory();
                selling_note_book = new SellingNoteBook();
            }
    
            public bool Source(int qty, string notename)
            {
                //验证库存,如果库存足够返回true
                if (production_note_book.CheckStock(qty))
                {
                    return true;
                }
                //库存不足提示消息
                return selling_note_book.Notify(notename);
            }
        }

    3、调用

            public static Facade facade = new Facade();
            static void Main(string[] args)
            {
                int demand = 100;
                string notename = "联想笔记本";
                if (facade.Source(demand, notename))
                {
                    Console.WriteLine("成功出售{0}台{1}!", demand, notename);
                }
                Console.ReadKey();
            }
        }

    使用了外观模式之后,客户端只依赖与外观类,从而将客户端与子系统的依赖解耦了,如果子系统发生改变,此时客户端的代码并不需要去改变。外观模式的实现核心主要是——由外观类去保存各个子系统的引用,实现由一个统一的外观类去包装多个子系统类,然而客户端只需要引用这个外观类,然后由外观类来调用各个子系统中的方法。然而这样的实现方式非常类似适配器模式,然而外观模式与适配器模式不同的是:适配器模式是将一个对象包装起来以改变其接口,而外观是将一群对象 ”包装“起来以简化其接口。它们的意图是不一样的,适配器是将接口转换为不同接口,而外观模式是提供一个统一的接口来简化接口

    五、使用前提:

    1. 为一个复杂的子系统提供一个简单的接口。
    2. 提供子系统的独立性。
    3. 在层次化结构中,可以使用外观模式定义系统中每一层的入口,例如三层架构。

    六、相关角色:

    门面(Facade)角色:客户端调用这个角色的方法。该角色知道相关的一个或多个子系统的功能和责任,该角色会将从客户端发来的请求委派带相应的子系统中去。

    子系统(subsystem)角色:可以同时包含一个或多个子系统。每个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用或被门面角色调用。对于子系统而言,门面仅仅是另外一个客户端,子系统并不知道门面的存在。

    七、总结:

    优点:

    1. 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
    2. 外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。

    缺点:

    1. 如果增加新的子系统可能需要修改外观类或客户端的源代码。
  • 相关阅读:
    参数是指针,传递指针变量,最后函数总分配的内存丢了
    GoDaddy域名注册/空间购买优惠码
    Godaddy主机新建网站说明
    Godaddy主机购买图解教程
    Godaddy 如何添加独立IP到主机账户
    GoDaddy域名注册图解
    Godaddy windows主机添加域名,删除域名,添加子域名 操作说明
    ASP.net与PHP两大网站开发架构优势对比
    Godaddy如何导入导出MSSQL数据库
    什么是DSN文件
  • 原文地址:https://www.cnblogs.com/jiechou/p/9136566.html
Copyright © 2011-2022 走看看