结构型模式之外观模式

概述

外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,使得客户类只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道

定义

为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

实现

子系统

    /// <summary>
    /// 注册账号类
    /// </summary>
    public class RegistAccount
    {
        /// <summary>
        /// 注册方法
        /// </summary>
        public void Register()
        {
            Console.WriteLine("账号注册成功...");
        }
    }
    /// <summary>
    /// 购物类
    /// </summary>
    public class Shopping
    {
        public void Shop()
        {
            Console.WriteLine("已选购商品...");
        }
    }
    /// <summary>
    /// 付款类
    /// </summary>
    public class Pay
    {
        public void PayMoney()
        {
            Console.WriteLine("付款成功...");
        }
    }

外观类

    /// <summary>
    /// 外观类
    /// </summary>
    public class ShoppingFacade
    {
        private Pay pay;
        private Shopping shopping;
        private RegistAccount regist;
        public ShoppingFacade(RegistAccount regist, Shopping shopping, Pay pay)
        {
            this.pay = pay;
            this.shopping = shopping;
            this.regist = regist;
        }

        public void Buy()
        {
            regist.Register();
            shopping.Shop();
            pay.PayMoney();
        }
    }

客户端

    class Program
    {
        static void Main(string[] args)
        {
            var regist = new RegistAccount();
            var shopping = new Shopping();
            var pay = new Pay();
            //通过外观类提供对外的访问接口,简化客户端访问方式
            ShoppingFacade fac = new ShoppingFacade(regist, shopping, pay);
            fac.Buy();
            Console.ReadLine();
        }
    }

总结

优点

1、它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。

2、它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。

3、一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

缺点

1、不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。

2、 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。

原文地址:https://www.cnblogs.com/Jabben_Yi/p/5571717.html