


/***
* @author shaofan
* @Description 状态模式解决抽奖问题
*/
public class LuckDraw {
public static void main(String[] args) {
Activity activity = new Activity(2);
// 只用通过activity对活动流程进行调用,每个流程阶段执行完之后都会将activity内部的state改变,然后activity根据不同的state来完成不同的行为
for (int i = 0; i < 100; i++) {
activity.deductScore();
if(activity.raffle()){
activity.dispensePrize();
}
}
}
}
class Activity{
private int count;
public Activity(int count){
this.count = count;
state = noRaffleState;
}
/**
* 当前状态
*/
private State state;
private State noRaffleState = new NoRaffleState(this);
private State canRaffleState = new CanRaffleState(this);
private State dispenseState = new DispenseState(this);
private State dispenseOutState = new DispenseOutState(this);
public void toNoRaffleState() {
state = noRaffleState;
}
public void toCanRaffleState(){
state = canRaffleState;
}
public void toDispenseState(){
state = dispenseState;
}
public void toDispenseOutState(){
state = dispenseOutState;
}
public int getCount(){
return count;
}
public void setCount(int count){
this.count = count;
}
public void deductScore(){
state.deductScore();
}
public boolean raffle(){
return state.raffle();
}
public void dispensePrize(){
state.dispensePrize();
}
}
abstract class State{
/**
* 扣除积分
*/
public abstract void deductScore();
/**
* 是否抽中奖品
* @return
*/
public abstract boolean raffle();
/**
* 发放奖品
*/
public abstract void dispensePrize();
}
/***
* 没有扣除积分,不能抽奖的状态
*/
class NoRaffleState extends State{
private final Activity activity;
public NoRaffleState(Activity activity){
this.activity = activity;
}
@Override
public void deductScore() {
System.out.println("扣除了50积分,您现在可以抽奖了");
activity.toCanRaffleState();
}
@Override
public boolean raffle() {
System.out.println("没有扣除积分,不能抽奖");
return false;
}
@Override
public void dispensePrize() {
System.out.println("不能发放奖品");
}
}
class CanRaffleState extends State{
private final Activity activity;
public CanRaffleState(Activity activity){
this.activity = activity;
}
@Override
public void deductScore() {
System.out.println("已经扣取了积分");
}
@Override
public boolean raffle() {
System.out.println("正在抽奖,请稍等");
Random random = new Random();
int num = random.nextInt(10);
if(num == 0){
activity.toDispenseState();
return true;
}
activity.toNoRaffleState();
return false;
}
@Override
public void dispensePrize() {
System.out.println("抽奖未结束,不能发放奖品");
}
}
class DispenseState extends State{
private final Activity activity;
public DispenseState(Activity activity){
this.activity = activity;
}
@Override
public void deductScore() {
System.out.println("不能扣除积分");
}
@Override
public boolean raffle() {
System.out.println("不能抽奖");
return false;
}
@Override
public void dispensePrize() {
System.out.println("正在发放奖品");
if(activity.getCount()>0){
activity.toNoRaffleState();
activity.setCount(activity.getCount()-1);
}else{
activity.toDispenseOutState();
}
}
}
class DispenseOutState extends State{
private Activity activity;
public DispenseOutState(Activity activity){
this.activity = activity;
}
@Override
public void deductScore() {
System.out.println("不能扣除积分");
}
@Override
public boolean raffle() {
System.out.println("不能抽奖");
return false;
}
@Override
public void dispensePrize() {
System.out.println("奖品已经发放完,请等待下一次活动");
}
}