zoukankan      html  css  js  c++  java
  • 深入理解设计模式(24):外观模式

    一、什么是外观模式

    定义:为子系统中的一组接口提供一个一致的界面,用来访问子系统中的一群接口。

    外观模式组成:

      Facade:负责子系统的的封装调用

      Subsystem Classes:具体的子系统,实现由外观模式Facade对象来调用的具体任务

    二、外观模式的使用场景

      1、设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式;
      2、开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口;
      3、维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

    三、外观模式的优缺点

    优点:

      1、实现了子系统与客户端之间的松耦合关系;
      2、客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

    缺点:

      1、不符合开闭原则,如果要修改某一个子系统的功能,通常外观类也要一起修改;
      2、没有办法直接阻止外部不通过外观类访问子系统的功能,因为子系统类中的功能必须是公开的(根据需要决定是否使用internal访问级别可解决这个缺点,但外观类需要和子系统类在同一个程序集内)。

    四、外观模式的实现

    先写出四个子系统的类

    class SubSystemOne
    {
        public void MethodOne()
        {
            Console.WriteLine("子系统方法一");
        }
    }
    class SubSystemTwo
    {
        public void MethodTwo()
        {
            Console.WriteLine("子系统方法二");
        }
    }
    class SubSystemThree
    {
        public void MethodThree()
        {
            Console.WriteLine("子系统方法三");
        }
    }
    class SubSystemFour
    {
        public void MethodFour()
        {
            Console.WriteLine("子系统犯法四");
        }
    }

    引入外观类,减少子系统类之间的交互

    class Facade
    {
        SubSystemOne one;
        SubSystemTwo two;
        SubSystemThree three;
        SubSystemFour four;
        public Facade()
        {
            one = new SubSystemOne();
            two = new SubSystemTwo();
            three = new SubSystemThree();
            four = new SubSystemFour();
        }
        public void MethodA()
        {
            Console.WriteLine("
    方法组合A()---");
            one.MethodOne();
            two.MethodTwo();
            four.MethodFour();
        }
        public void MethodB()
        {
            Console.WriteLine("
    方法组B()---");
            two.MethodTwo();
            three.MethodThree();
        }
    }

    客户端代码:

    static void Main(string[] args)
    {
        Facade facade = new Facade();
        facade.MethodA();
        facade.MethodB();
        Console.Read();
    }
  • 相关阅读:
    JS内置对象-Array之splice-删插替
    for-in的缺点
    Obeject.hasOwnProperty
    JS中的深拷贝和浅拷贝
    函数中this的指向
    CSS预处理器之less和sass
    [转]javaweb学习总结(四十四)——监听器(Listener)学习
    [转]javaweb学习总结(四十三)——Filter高级开发
    [转]javaweb学习总结(四十二)——Filter(过滤器)学习
    [转]javaweb学习总结(四十一)——Apache的DBUtils框架学习
  • 原文地址:https://www.cnblogs.com/xuwendong/p/10414861.html
Copyright © 2011-2022 走看看