Head First 设计模式 - 状态模式
source link: https://tuncle.blog/Ch%2010%20the%20State%20Pattern/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Head First 设计模式 - 状态模式
状态模式 (State Pattern) 允许一个对象根据其内部状态的变化来选择需要执行的操作。这个对象会看起来像是改变了它的类。
状态模式定义听起来有些奇怪,实际上就是将不同状态的行为定义在不同的状态类中,然后根据状态的不同切换这些状态类,进而达到不同的行为。
例如我们需要做一个口香糖贩卖机需要处理,投钱、退钱、旋转出货按钮这三个操作,然后机器有未投钱、投钱、货物卖出、货物卖完四个状态。我们可以将不同状态下对三个操作的处理定义在各自的状态类中。
状态类接口
public interface State
{
void InsertQuarter();
void EjectQuarter();
void TurnCrank();
void Dispense();
}
状态类实现
public class NoQuarterState : State
{
private GumballMachine gumballMachine = null;
public NoQuarterState(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
public void Dispense() { Console.WriteLine("You need to pay first"); }
public void EjectQuarter() { Console.WriteLine("You haven't inserted a quarter"); }
public void InsertQuarter()
{
gumballMachine.SetState(gumballMachine.HasQuarterState);
Console.WriteLine("You inserted a quarter");
}
public void TurnCrank() { Console.WriteLine("You turned,but there's no quarter"); }
}
public class HasQuarterState : State
{
private GumballMachine gumballMachine = null;
public HasQuarterState(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
public void Dispense()
{
Console.WriteLine("No gumball dispensed");
}
public void EjectQuarter()
{
Console.WriteLine("Quarter returned");
gumballMachine.SetState(gumballMachine.NoQuarterState);
}
public void InsertQuarter()
{
Console.WriteLine("You can't insert another quater");
}
public void TurnCrank()
{
Console.WriteLine("You turned");
gumballMachine.SetState(gumballMachine.SoldState);
}
}
public class SoldState : State
{
private GumballMachine gumballMachine = null;
public SoldState(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
public void Dispense()
{
gumballMachine.ReleaseBall();
if (gumballMachine.remainGumballsNum > 0)
gumballMachine.SetState(gumballMachine.NoQuarterState);
else
{
Console.WriteLine("Opps,out of gumballs");
gumballMachine.SetState(gumballMachine.SoldOutState);
}
}
public void EjectQuarter()
{
Console.WriteLine("Sorry,you already turned the crank");
}
public void InsertQuarter()
{
Console.WriteLine("Please wait,we are already giving you a gumball");
}
public void TurnCrank()
{
Console.WriteLine("Turning twice dones't get you another gumball");
}
}
public class SoldOutState : State
{
private GumballMachine gumballMachine = null;
public SoldOutState(GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
public void Dispense()
{
Console.WriteLine("No gumball dispensed");
}
public void EjectQuarter()
{
Console.WriteLine("You can't eject,you haven't inserted a quarter yet");
}
public void InsertQuarter()
{
Console.WriteLine("You can't insert a quarter,the machine is sold out");
}
public void TurnCrank()
{
Console.WriteLine("You turned,but there are no gumballs");
}
}
测试代码及结果
GumballMachine gumballMachine = new GumballMachine(5);
gumballMachine.TurnCrank();
gumballMachine.InsertQuarter();
gumballMachine.EjectQuarter();
gumballMachine.TurnCrank();
gumballMachine.InsertQuarter();
gumballMachine.TurnCrank();
gumballMachine.TurnCrank();
gumballMachine.EjectQuarter();
运行结果:
Recommend
-
3
《Head First 设计模式》 Ch 10 状态模式发表于 2023-05-20 字数总计:633|阅读时长:3 分钟 | 阅读量:1状态模式 (State Pattern) 允许一个对象根据其内部状态的变...
-
13
Head First 设计模式 —— 02. 观察者 (Observer) 模式 ...
-
4
思考题 如何设计一个支持远程方法调用的系统?你要怎样才能让开发人员不用写太多代码?让远程调用看起来像本地调用一样,毫无瑕疵? P435 已经接触过 RPC 了,所以就很容易知道具体流程:客户端...
-
3
复合模式 在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。 P500 思考题 public interface Quackable { public void quack(); } public class MallardDuck imple...
-
8
《Head First 设计模式》学习笔记 | 观察者模式0 Comments往期回顾:
-
4
《Head First 设计模式》学习笔记 | 策略模式1 Comment我最近在看大名鼎鼎的《Head First 设计模式》。这本「OO 圣经」用 Java 实现各类设计模式,...
-
4
Head First设计模式之适配器模式与外观模式 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西。这样就可以在设计中将类的接口转化为想要的接口,以实现同的接口,此外...
-
8
本章会将封装带入到一个全新的境界,把方法调用封装起来。通过封装方法调用,把运算块包装成形。调用此运算的对象不需要知道事情是如何进行的,只要知道如何使用包装形成的方法来完成它就ok了。 1 现实场景应用 现在有一个遥控器,该遥控...
-
3
Head First 设计模式 - 适配器模式和外观模式发表于 2023-05-17 字数总计:814|阅读时长:3 分钟 | 阅读量:适配器模式 适配器模式(Adapter Pattern)将...
-
1
Head First 设计模式 - 命令模式发表于 2023-05-16 字数总计:484|阅读时长:2 分钟 | 阅读量:命令模式(Command Pattern)将一个请求封装为一个对象,进而将拥有...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK