立面设计模式 - 实施

时间:2011-09-24 18:28:09

标签: implementation facade

我指的是Eric Gamma关于可重用模式的可重用面向对象软件的元素。然而,我理解了Facade模式的概念,但仍然无法理解本书中给出的实现点,因为我对实现部分esp很不满意。

以下是本书中提到的2点:

  1. 减少客户端子系统耦合:将Facade类设为抽象类。

  2. Public v / s私有子系统类。

  3. 有人可以通过一些例子或我的代码向我解释:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Facade_CSharp
    {
        class Program
        {
            static void Main(string[] args)
            {
                Facade facade = new Facade();
    
                facade.ProcessA();
                facade.ProcessB();
    
                // Wait for user
                Console.ReadKey();
            }
        }
    
         /// <summary>
      /// The 'Subsystem ClassA' class
      /// </summary>
      class SubSystemOne
      {
        public void MethodOne()
        {
          Console.WriteLine(" SubSystem One");
        }
      }
    
      /// <summary>
      /// The 'Subsystem ClassB' class
      /// </summary>
      class SubSystemTwo
      {
        public void MethodTwo()
        {
          Console.WriteLine(" SubSystem Two");
        }
      }
    
      /// <summary>
      /// The 'Subsystem ClassC' class
      /// </summary>
      class SubSystemThree
      {
        public void MethodThree()
        {
          Console.WriteLine(" SubSystem Three");
        }
      }
    
      /// <summary>
      /// The 'Subsystem ClassD' class
      /// </summary>
      class SubSystemFour
      {
        public void MethodFour()
        {
          Console.WriteLine(" SubSystem Four");
        }
      }
    
      /// <summary>
      /// The 'Facade' class
      /// </summary>
      class Facade
      {
        private SubSystemOne _one;
        private SubSystemTwo _two;
        private SubSystemThree _three;
        private SubSystemFour _four;
    
        public Facade()
        {
            Console.WriteLine("\nRequests received from Client System and Facade is in execution... ");
    
          _one = new SubSystemOne();
          _two = new SubSystemTwo();
          _three = new SubSystemThree();
          _four = new SubSystemFour();
        }
    
        public void ProcessA()
        {
          Console.WriteLine("\nProcessA of Facade uses the following subsystems to accomplish the task:");
          _one.MethodOne();
          _two.MethodTwo();
          _four.MethodFour();
        }
    
        public void ProcessB()
        {
            Console.WriteLine("\nProcessB of Facade uses the following subsystems to accomplish the task:");
          _two.MethodTwo();
          _three.MethodThree();
        }
      }
    }
    

    抽象类代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Facade_abstract
    {
        class Program
        {
            static void Main(string[] args)
            {
                FacadeAbs facade = new FacadeAbs();
    
                facade.ProcessA();
                facade.ProcessB();
    
                // Wait for user
                Console.ReadKey();
    
            }
        }
    
        class SubSystemOne
        {
            public void MethodOne()
            {
                Console.WriteLine(" SubSystem One");
            }
        }
    
        /// <summary>
        /// The 'Subsystem ClassB' class
        /// </summary>
        class SubSystemTwo
        {
            public void MethodTwo()
            {
                Console.WriteLine(" SubSystem Two");
            }
        }
    
        /// <summary>
        /// The 'Subsystem ClassC' class
        /// </summary>
        class SubSystemThree
        {
            public void MethodThree()
            {
                Console.WriteLine(" SubSystem Three");
            }
        }
    
        /// <summary>
        /// The 'Subsystem ClassD' class
        /// </summary>
        class SubSystemFour
        {
            public void MethodFour()
            {
                Console.WriteLine(" SubSystem Four");
            }
        }
    
        /// <summary>
        /// The 'Facade' class
        /// </summary>
        public abstract class Facade
        {
            //public abstract Facade();
    
            public abstract void ProcessA();
    
            public abstract void ProcessB();
    
        }
    
        public class FacadeAbs : Facade
        {
            private SubSystemOne _one;
            private SubSystemTwo _two;
            private SubSystemThree _three;
            private SubSystemFour _four;
    
            public FacadeAbs()
            {
                Console.WriteLine("\nRequests received from Client System and Facade is in execution... ");
    
                _one = new SubSystemOne();
                _two = new SubSystemTwo();
                _three = new SubSystemThree();
                _four = new SubSystemFour();
            }
    
    
            public override void ProcessA()
            {
                Console.WriteLine("\nProcessA of Facade uses the following subsystems to accomplish the task:");
                _one.MethodOne();
                _two.MethodTwo();
                _four.MethodFour();
            }
    
            public override void ProcessB()
            {
                Console.WriteLine("\nProcessB of Facade uses the following subsystems to accomplish the task:");
                _two.MethodTwo();
                _three.MethodThree();
            }
    
        }
    }
    

1 个答案:

答案 0 :(得分:2)

Facade用于减少程序之间的耦合。

在示例中,ProcessA调用3个方法 -
_one.MethodOne();
_two.MethodTwo();
_four.MethodFour();

客户端只调用ProcessA方法。 外立面仅用于减少耦合,依赖性。

如果没有外观,客户端将成为调用这些方法的人。

因此Facade类提供以下内容 -

  1. 隐藏多个电话。这有助于客户端只需拨打一个电话。防止紧耦合。例如仅限ProcessA
  2. 如果任何方法更改添加或删除参数,则客户端代码需要更改。但是在外观的情况下,更改不会影响客户端。
  3. 客户端只有几个服务器端的公共访问点。服务器端可以封装其代码。少点失败。