题目:某航空公司的会员积分系统将其会员分为:普卡(Basic)、银卡(Silver)、金卡(Gold)三个等级。非会员(NonMember)可以申请为普卡会员。会员的等级根据其一年内累积的历程数进行调整。描述会员等级调整的状态图如下,

状态模式(State)-02_java

现采用状态模式描述上述场景

import java.util.*;

abstract class CState  
{

	public int flyMiles; //里程数

	public abstract double travel(int miles,FrequentFlyer context) ;  //1

                                      //根据里程数调整会员等级

}

class CNoCustomer extends	CState //非会员

{

	public double travel (int miles,FrequentFlyer context)

	{System.out.println("Your travel will not account for points");

	 return miles;  //不累计里程数

  }

 }

class CBasic extends CState  //普卡会员

{

	public double travel (int miles,FrequentFlyer context)

	{if (context.flyMiles>=25000&&context.flyMiles<50000)

  context.setState(new CSilver());     

	if (context.flyMiles>=50000)

     context.setState(new CGold());      

	return miles;

  
	}


}

class CSilver extends CState  //银卡会员

{

	public double travel(int miles,FlyquentFlyer context)

{

  if (context.flyMiles<=25000)

  {    context.setState(new CBasic());  
      //context是FlyquentFlyer类型的对象,可以直接调用类中的setState方法

  }

  if (contexct.flyMiles>50000)

  {

  	context.setState(new CGold());

            return (miles+0.25miles);     
                           //累积里程数。实际的返回值的类型是double类型

   }
  
 }
  
}

class CGold extends CState   //金卡会员

{

	public double travel(int miles,FrequentFlyer context)

    {

  if (context.flyMiles>=25000&&context.flyMiles<50000)

      context.setState(new CSilver());    

  if(context.flyMiles<=25000)

  	context.setState(new CBasic());

  return miles+0.5*miles;  //累积里程数

}

}

class FrequentFlyer  
{

	CState state;

	double flyMiles;

	public FrequentFlyer();          //初始化

	{

  state =new CNoCustomer();

  flyMiles=0;

  setState(state);       //可以在方法中调用同一个类中的另一个方法

	}

	public void setState(CState state){this.state=state;}

	public void travel(int miles)    

	{

  double bonusMiles=state.travel(miles,this);   
                                           //奖励里程=累积里程+奖励里程

               //this 参数表示调用 travel 方法的 FrequentFlyer 对象实例

  flyMiles=flyMiles+bonusMiles;       
                                           //每次调用时累加上次计算结果

	}

}