状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像改变了他的类.
这说的有点玄乎,其实就是将一群状态的公共行为封装进一个抽象的状态对象(Status)里,然后通过实现这个抽象类来自定义自己的行为,最重要的一点是,这些行为和状态之间联系也被封装在其中,所以,随着流程的进行,作为拥有这些内部状态的类(Context),它的行为也会自动的游走于各个状态对象,从而实现行为的改变.同为一个Insert方法,由于Status对象的不同,Insert行为也会返回不同的效果.
有图为证:
上代码:
/**
* @author dean
* 相当于Context类
*/
public class GumballMachine
{
Status hasQuartreStatus;
Status noQuarterStatus;
Status soldStatus;
Status soldOutStatus;
int count = 0; //糖果数目
Status status;
public GumballMachine(int num)
{
hasQuartreStatus = new HasQuarterStatus(this);
noQuarterStatus = new NoquarterStatus(this);
soldOutStatus = new SoldOutStatus(this);
soldStatus = new SoldStatus(this);
this.count = num;
status = noQuarterStatus;// 初始化状态
}
public void insertQuarter() {
status.insertQuarter();
}
public void ejectQuarter() {
status.ejectQuarter();
}
public void turnCrack() {
status.turnCrack();
status.dispense();
}
public void releaseBall()
{
if(count>0)
{
System.out.println("a gumball is giving...");
count--;
}else
{
System.out.println("sorry, the gumball is sold out");
}
}
public Status getHasQuartreStatus() {
return hasQuartreStatus;
}
public void setHasQuartreStatus(Status hasQuartreStatus) {
this.hasQuartreStatus = hasQuartreStatus;
}
public Status getNoQuarterStatus() {
return noQuarterStatus;
}
public void setNoQUarterStatus(Status noQUarterStatus) {
this.noQuarterStatus = noQUarterStatus;
}
public Status getSoldStatus() {
return soldStatus;
}
public void setSoldStatus(Status soldStatus) {
this.soldStatus = soldStatus;
}
public Status getSoldOutStatus() {
return soldOutStatus;
}
public void setSoldOutStatus(Status soldOutStatus) {
this.soldOutStatus = soldOutStatus;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
/**
* @author dean
* 状态的抽象类,封装各个状态的公共行为
*/
public interface Status
{
// 投入硬币
public void insertQuarter();
// 弹出硬币
public void ejectQuarter();
// 转动拉杆
public void turnCrack();
// 发放
public void dispense();
}
/**
* @author dean
* 没有投币的状态
*/
public class NoquarterStatus implements Status
{
GumballMachine gumballMachine;
public NoquarterStatus(GumballMachine gunballMachine) {
super();
this.gumballMachine = gunballMachine;
}
@Override
public void insertQuarter() {
System.out.println("you have inserted quarters");
gumballMachine.setStatus(gumballMachine.getHasQuartreStatus());
}
@Override
public void ejectQuarter() {
System.out.println("please insert quarter first");
}
@Override
public void turnCrack() {
System.out.println("please insert quarter first");
}
@Override
public void dispense() {
}
}
/**
* @author dean 投币之后的状态
*/
public class HasQuarterStatus implements Status {
GumballMachine gumballMachine;
public HasQuarterStatus(GumballMachine gunballMachine) {
this.gumballMachine = gunballMachine;
}
@Override
public void insertQuarter() {
System.out.println("Don't insert another quarters");
}
@Override
public void ejectQuarter() {
System.out.println("quarter returns");
gumballMachine.setStatus(gumballMachine.getNoQuarterStatus());
}
@Override
public void turnCrack() {
System.out.println("you turned the crack");
gumballMachine.setStatus(gumballMachine.getSoldStatus());
}
@Override
public void dispense() {
throw new UnsupportedOperationException();
}
}
/**
* @author dean
* 售出状态
*/
public class SoldStatus implements Status
{
GumballMachine gumballMachine;
public SoldStatus(GumballMachine gunballMachine) {
super();
this.gumballMachine = gunballMachine;
}
@Override
public void insertQuarter() {
System.out.println("you have inserted quarter,please wait....");
}
@Override
public void ejectQuarter() {
System.out.println("you have turned the crack...");
}
@Override
public void turnCrack() {
System.out.println("the gumball is given,It is too late...");
}
@Override
public void dispense() {
this.gumballMachine.releaseBall();
if(gumballMachine.getCount()>0)
{
gumballMachine.setStatus(gumballMachine.getNoQuarterStatus());
}else
{
gumballMachine.setStatus(gumballMachine.getSoldOutStatus());
}
}
}
/**
* @author dean
* 罄销状态
*/
public class SoldOutStatus implements Status
{
GumballMachine gunballMachine;
public SoldOutStatus(GumballMachine gunballMachine) {
super();
this.gunballMachine = gunballMachine;
}
@Override
public void insertQuarter() {
System.out.println("Sorry,the gumball has sold out...");
}
@Override
public void ejectQuarter() {
System.out.println("Sorry,the gumball has sold out...");
}
@Override
public void turnCrack() {
System.out.println("Sorry,the gumball has sold out...");
}
@Override
public void dispense() {
System.out.println("Sorry,the gumball has sold out...");
}
}
/**
* @author dean
* 测试类
*/
public class Test
{
public static void main(String[] args) {
//
GumballMachine gumballMachine = new GumballMachine(3);
gumballMachine.insertQuarter();
gumballMachine.turnCrack();
System.out.println("=============");
//
gumballMachine.turnCrack();
System.out.println("=============");
//
gumballMachine.insertQuarter();
gumballMachine.ejectQuarter();
gumballMachine.turnCrack();
System.out.println("=============");
//
gumballMachine.insertQuarter();
gumballMachine.turnCrack();
System.out.println("=============");
//
gumballMachine.insertQuarter();
gumballMachine.turnCrack();
System.out.println("=============");
//
gumballMachine.insertQuarter();
gumballMachine.turnCrack();
}
}