比较设计模式

Lij*_*ijo 0 design-patterns

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

  1. 桥梁与战略
  2. 国家与战略
  3. 外观和战略
  4. 综合与战略

我知道网络上有很多可用的资源.但是他们没有对待这种特殊情况.

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


感谢您的答复.我更多地尝试学习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();
            }
    
    Run Code Online (Sandbox Code Playgroud)

ext*_*eon 8

我可以为这个推荐Head First Design Patterns.从那本书:

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

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

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

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

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

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