【发布时间】:2018-06-28 19:04:27
【问题描述】:
我正在学习模式,当我遇到状态和策略模式时我感到很困惑。一个简单的谷歌搜索把我带到了这个stact overflow blog,这让我更加困惑。
我的简单问题是,
战略模式
public interface Istrategy {
void algorithm();
}
public class add : Istrategy
{
public void algorithm()
{
Console.WriteLine("addition");
}
}
public class multiply : Istrategy
{
public void algorithm()
{
Console.WriteLine("multiply");
}
}
public class subtract : Istrategy
{
public void algorithm()
{
Console.WriteLine("subtract");
}
}
public class context {
public context(Istrategy strategy) {
strategy.algorithm();
}
}
public class client {
static void Main() {
new context(new add());
Console.ReadLine();
}
}
状态模式
public interface Istate {
void algorithm();
}
public class add : Istate
{
public void algorithm()
{
Console.WriteLine("addition");
}
}
public class multiply : Istate
{
public void algorithm()
{
Console.WriteLine("multiply");
}
}
public class subtract : Istate
{
public void algorithm()
{
Console.WriteLine("subtract");
}
}
public class context {
Istate state;
public context(Istate state) {
state.algorithm();
}
}
public class client {
static void Main() {
new context(new add());
Console.ReadLine();
}
}
在上面的例子中,根据我的理解,我认为将对象传递给上下文而不保存任何状态是策略模式,而将状态保持在上下文中是状态模式。
我的理解对吗?
更新 1
interface Istate
{
void action();
}
class walk : Istate
{
public void action()
{
Console.WriteLine("walking !!!");
}
}
class run : Istate
{
public void action()
{
Console.WriteLine("running !!!");
}
}
class fly : Istate
{
public void action()
{
Console.WriteLine("flying !!!");
}
}
class context
{
Istate state;
public void statePattern()
{
for (var i = 0; i < 3; i++)
{
if (i == 0)
{
state = new walk();
state.action();
}
if (i == 1)
{
state = new run();
state.action();
}
if (i == 2)
{
state = new fly();
state.action();
}
}
}
}
public class client
{
static void Main()
{
new context().statePattern();
Console.ReadLine();
}
}
所以根据我的理解,这种方法是状态模式还是策略模式下的方法?
interface Istate
{
void action();
}
class walk : Istate
{
public void action()
{
Console.WriteLine("walking !!!");
}
}
class run : Istate
{
public void action()
{
Console.WriteLine("running !!!");
}
}
class fly : Istate
{
public void action()
{
Console.WriteLine("flying !!!");
}
}
class context
{
public void statePattern(Istate state)
{
state.action();
}
public void startegy()
{
for (var i = 0; i < 3; i++)
{
if (i == 0)
{
statePattern(new walk());
}
if (i == 1)
{
statePattern(new run());
}
if (i == 2)
{
statePattern(new fly());
}
}
}
}
public class client
{
static void Main()
{
new context().startegy();
Console.ReadLine();
}
}
请告诉我,谢谢
【问题讨论】:
标签: design-patterns strategy-pattern state-pattern