HeadFirst设计模式_读书笔记_010_状态模式

本文介绍了一个使用状态模式的实际案例,通过12306购票系统的简化版来展示如何根据余票状态的变化调整售票行为。当有余票时,能够正常出票;而当余票为零时,则显示无法出票的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

状态模式:允许对象在内部状态改变的时候改变它的行为。

 

例如: 我们在12306上买票,行为是卖票,状态有两个,有余票则出票成功,余票不足就出票失败。

public class Station {

	public State state;
	private int tickets = 0;
	public Station(int tickets)
	{
		this.tickets = tickets;
		if(tickets>0)
		{
			state = new HasTicketState(this);
		}
	}
	
	public void soldTickets()
	{
		state.soldTicket();
	}
	
	public void setTickets(int tickets)
	{
		this.tickets = tickets;
		if(tickets>0)
		{
			state = new HasTicketState(this);
		}

	}
	
	public int getTickets()
	{
		return this.tickets;
	}
	
	public void setState(State sta)
	{
		this.state = sta;
	}

}

 

public abstract class State {
	
	public abstract void soldTicket();
	

}

 

public class NoTicketState extends State{

	@Override
	public void soldTicket() {
	   System.out.println("没有余票,出票失败");
	}

}

 

public class HasTicketState extends State{
	private Station station;
	public HasTicketState(Station sta)
	{
		this.station = sta;
	}
	
	@Override
	public void soldTicket() {
		station.setTickets(station.getTickets()-1);
		System.out.println("出票成功,余票" + station.getTickets()+"张");
		if(station.getTickets() == 0)
		{
			this.station.setState(new NoTicketState());
		}
		
	}

}

 

	public static void main(String args[])
	{
		Station sta = new Station(3);
		sta.soldTickets();
		sta.soldTickets();
		sta.soldTickets();
		sta.soldTickets();
		sta.setTickets(10);
		sta.soldTickets();
		sta.soldTickets();
	}
}

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值