题目:某航空公司的会员积分系统将其会员分为:普卡(Basic)、银卡(Silver)、金卡(Gold)三个等级。非会员(NonMember)可以申请为普卡会员。会员的等级根据其一年内累积的历程数进行调整。描述会员等级调整的状态图如下,
现采用状态模式描述上述场景
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;
//每次调用时累加上次计算结果
}
}