我正在使用C#学习设计模式。我面临的挑战之一是它们看起来很相似。你能帮我区分一下 - 基本上什么时候使用它们? - 为什么不是另一个?
我知道网络上有很多资源可供使用。但是他们没有对待这种特殊情况。
[注意:我正在寻找选择背后的实施例子和理由;不仅仅是解释]
感谢您的回复。我更多地尝试学习Bridge。
我有以下情况。
在我的房间里有两部电视。每个人都有自己的遥控器;但两者都有相同的界面供用户使用。但是我想拥有自己的遥控器,我将使用两个遥控器中的任何一个的处理器。
我有以下代码。我想,这是战略模式。我想把它转换成Bridge。
转换成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();
}
答案 0 :(得分:8)
我可以为此推荐Head First Design Patterns。从那本书:
国家与战略之间的区别在于意图。使用状态模式可以在对象的生命周期中动态地改变行为。它是全班if语句的替代方案。使用策略模式,通常在构造对象时执行一次。它是子类化的替代方案。行为很灵活,但对于agiven对象,您只需配置一次。
外观和战略彼此无关。该策略旨在在运行时配置行为(实现)。 Facade只是简化了现有界面。如果您有一个复杂的ATM系统,您可能需要2个接口。一个拥有所有权力,包括如何处理错误等的各种方法,以及一个可以更简单的前端调用的方法。前端代码不需要知道如何处理错误,其他地方的错误处理程序会处理错误。它只需要知道是错误。简化的界面(希望随着时间的推移也更加稳定)将使前端开发人员的生活更简单,并隐藏可能更改的元素。那是你制作门面的时候。您拥有功能齐全的界面,但大多数人只使用一个子集。该子集将成为Facade。
复合模式允许您将对象组合成树结构。我看不出你怎么看不到战略模式的差异。他们几乎没有任何共同点。
也许有些想法实际使用这些模式:
我真的推荐Head First Design Patterns,因为他们甚至采访了各种模式!然后,模式会对自己有所了解,以及为什么它们是最好的模式:)
答案 1 :(得分:0)
状态与策略:在状态中,控制决定使用哪种算法(取决于其当前状态)是对象,而在策略中,是控制使用何种算法的客户端
答案 2 :(得分:0)
" ..是控制决定使用哪种算法的对象。"不是那么清楚(对我来说,至少)。
对象有一个状态指针,让我们说" currentState"指针。 所有状态都支持相同的接口,知道如何处理方法A,B和C(例如)。
当对象需要执行某种方法(A,B或C - 由State接口公开)时,它会触发 currentState.A(), currentState.B()或 currentState.C()。
实际处理在每个州内进行; 这样我们就可以避免使用多个if-else条件来确定自己的状态。