Design patterns 比较设计模式
我正在使用C#学习设计模式。我面临的挑战之一是它们看起来很相似。你能帮我区分它们吗?基本上是什么时候使用它们为什么不是另一个呢Design patterns 比较设计模式,design-patterns,Design Patterns,我正在使用C#学习设计模式。我面临的挑战之一是它们看起来很相似。你能帮我区分它们吗?基本上是什么时候使用它们为什么不是另一个呢 桥梁与战略 国家和战略 外表与战略 复合材料与战略 我知道网络上有很多可用的资源。但是,他们没有处理这种特殊情况 [注:我正在寻找选择背后的实施示例和理由;而不仅仅是解释] 谢谢你的回复。我更加努力地学习桥牌 我有下面的场景 在我的房间里有两台电视。每个都有自己的遥控器;但两者都有相同的界面供用户使用。然而,我想有我自己的遥控器,在其中我将使用两个遥控器中任何一个的处
谢谢你的回复。我更加努力地学习桥牌 我有下面的场景 在我的房间里有两台电视。每个都有自己的遥控器;但两者都有相同的界面供用户使用。然而,我想有我自己的遥控器,在其中我将使用两个遥控器中任何一个的处理器 我有以下代码。我想,这就是战略模式。我想把这个转换成桥
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();
}
我可以推荐这一款的头优先设计模式。从那本书中: 国家和战略的区别在于意图。使用状态模式,可以在对象的生命周期中动态更改行为。它是整个类中if语句的一种替代方法。使用策略模式,通常在构建对象时执行一次。它是子类化的另一种选择。行为是灵活的,但对于agiven对象,您只需配置一次 门面和策略之间没有任何关系。该策略旨在在运行时配置行为(实现)。Facade只是简化了现有的接口。如果您有一个复杂的ATM系统,您可能需要两个接口。一个拥有所有的功能,包括关于如何处理错误等的各种方法,一个由前端调用,这可能更简单。前端代码不需要知道如何处理错误,其他地方的错误处理程序会处理这个问题。它只需要知道有一个错误。一个简化的界面(希望随着时间的推移也更稳定)将使前端开发人员的生活更简单,并隐藏可能发生变化的元素。这就是你做门面的时候。您拥有功能齐全的界面,但大多数人只使用一个子集。该子集将是外观 复合模式允许您将对象组合到树结构中。我看不出你怎么看不出战略模式的不同。他们几乎没有什么共同之处 也许对这些模式的实际使用有一些想法:
- 当您的数据模型还不清楚时,桥接。您将大部分实现作为对自身的调用来实现。这样,即使抽象仍然不确定,您也可以对实现进行适当的处理
- 状态通常在状态数量有限且行为明显不同的情况下使用。我想到这里的咖啡机和打印机。尽管您可以实现一个银行系统,如果余额低于零,那么减去(金额)将始终生成一个错误:)
- 立面并不少见。您可能有一个带有API的数据层(例如Hibernate),该API包含业务流程和维护流程所使用的方法。然后,您可以定义两个更简单的API,一个用于业务开发人员,另一个用于维护开发人员。这些API当然会调用完整的API,但作为业务开发人员,您不会看到这一点
- 这种策略是相当普遍的,如果您使用Spring或任何其他形式的IoC,最肯定的是,对于Junit测试,您通常也会注入一个替代的“数据库”层
- 组合模式可能最常用于GUI应用程序中。现在想不出其他的用例李>
我真的推荐Head-First设计模式,因为他们甚至采访了各种模式!然后,这些模式讲述了它们自己,以及它们为什么是所有模式中最好的模式:)状态与策略:在状态中,由对象决定使用哪种算法(这取决于其当前状态),而在策略中,由客户机控制使用哪种算法 “。决定使用哪种算法的是由对象控制的…”不是很清楚(至少对我来说) 对象有一个状态指针,比如说“currentState”指针。 所有状态都支持相同的接口,知道如何处理方法A、B和C(例如) 当对象需要执行某些方法(A、B或C-由状态接口公开)时,它会触发currentState.A(),currentState.B()或currentState.C() 实际处理在每个状态内完成;
这样我们就避免了使用多种if-else条件来确定自己的状态。这似乎是一个家庭作业问题。相反,也许你应该试着自己回答这个问题,然后发布你的答案,让人们批评/改进你的答案。这不是一个家庭作业问题。家庭作业问题不需要这些例子,对吗?毕竟我是一名软件工程专业人士,解释一下你迄今为止的研究结果会有助于避免回答者不得不涉及同样的问题。@ChrisW-“家庭作业问题”的评论似乎是目前这个月的热门话题。这是一个软件开发社区感兴趣的有效问题,因此这是一个关于堆栈溢出的有效问题。