比较设计模式

时间:2010-05-21 10:25:57

标签: design-patterns

我正在使用C#学习设计模式。我面临的挑战之一是它们看起来很相似。你能帮我区分一下 - 基本上什么时候使用它们? - 为什么不是另一个?

  1. 桥梁和战略
  2. 国家与战略
  3. 外观与策略
  4. 复合与策略
  5. 我知道网络上有很多资源可供使用。但是他们没有对待这种特殊情况。

    [注意:我正在寻找选择背后的实施例子和理由;不仅仅是解释]


    感谢您的回复。我更多地尝试学习Bridge。

    我有以下情况。

    在我的房间里有两部电视。每个人都有自己的遥控器;但两者都有相同的界面供用户使用。但是我想拥有自己的遥控器,我将使用两个遥控器中的任何一个的处理器。

    我有以下代码。我想,这是战略模式。我想把它转换成Bridge。

    1. 如何将其转换为Bridge?
    2. 转换成Bridge会有什么好处?

      公共课PhilliTV             {                 public void Begin()                 {                     Console.WriteLine(“PhilliTV Bagan”);                 }             }

      public class SonTV
          {
              public void Initiate()
              {
                  Console.WriteLine("SonTV Initiated");
              }
           }
      
      
      
      
        public class SonRemote : IRemote
          {
              SonTV stv = new SonTV();
              public void Play()
              {
                  stv.Initiate();
              }
          }
      
      
       public class PhilliRemote : IRemote
          {
              PhilliTV ptv = new PhilliTV();
              public void Play()
              {
                  ptv.Begin();
              }
          }
      
      
        public class URemoteConsumer
          {
              IRemote remote = new PhilliRemote();
      
              public void MyPlay()
              {
                  remote.Play();
              }
      

3 个答案:

答案 0 :(得分:8)

我可以为此推荐Head First Design Patterns。从那本书:

国家与战略之间的区别在于意图。使用状态模式可以在对象的生命周期中动态地改变行为。它是全班if语句的替代方案。使用策略模式,通常在构造对象时执行一次。它是子类化的替代方案。行为很灵活,但对于agiven对象,您只需配置一次。

外观和战略彼此无关。该策略旨在在运行时配置行为(实现)。 Facade只是简化了现有界面。如果您有一个复杂的ATM系统,您可能需要2个接口。一个拥有所有权力,包括如何处理错误等的各种方法,以及一个可以更简单的前端调用的方法。前端代码不需要知道如何处理错误,其他地方的错误处理程序会处理错误。它只需要知道错误。简化的界面(希望随着时间的推移也更加稳定)将使前端开发人员的生活更简单,并隐藏可能更改的元素。那是你制作门面的时候。您拥有功能齐全的界面,但大多数人只使用一个子集。该子集将成为Facade。

复合模式允许您将对象组合成树结构。我看不出你怎么看不到战略模式的差异。他们几乎没有任何共同点。

也许有些想法实际使用这些模式:

  • 当您的数据模型尚不清楚时进行桥接。您将大多数实现实现为对自身的调用。这样,即使抽象仍然不确定,你也可以做出相当不错的实现
  • 状态通常在只有有限数量的状态时使用,并且行为明显不同。我在想这里的咖啡机和打印机。虽然你可以实施一个银行系统,如果余额低于零,减法(金额)总会产生错误:)
  • 门面并不少见。您可能拥有一个带有API的数据层(例如Hibernate),该API具有业务流程和维护流程使用的方法。然后,您可以定义2个更简单的API,一个用于业务开发人员,一个用于维护开发人员。这些API当然会调用完整的API,但您不会将其视为业务开发人员。
  • 策略是相当普遍的,当然如果你使用Spring或任何其他形式的IoC,并且对于Junit测试,你通常也会注入另一个“数据库”层。
  • 复合模式可能最常用于GUI应用程序。现在想不到其他用例。

我真的推荐Head First Design Patterns,因为他们甚至采访了各种模式!然后,模式会对自己有所了解,以及为什么它们是最好的模式:)

答案 1 :(得分:0)

状态与策略:在状态中,控制决定使用哪种算法(取决于其当前状态)是对象,而在策略中,是控制使用何种算法的客户端

答案 2 :(得分:0)

  

" ..是控制决定使用哪种算法的对象。"不是那么清楚(对我来说,至少)。

对象有一个状态指针,让我们说" currentState"指针。 所有状态都支持相同的接口,知道如何处理方法A,B和C(例如)。

当对象需要执行某种方法(A,B或C - 由State接口公开)时,它会触发 currentState.A() currentState.B() currentState.C()

实际处理在每个州内进行; 这样我们就可以避免使用多个if-else条件来确定自己的状态。

相关问题