状态模式
这种类型的设计模式属于行为型模式,它他解决了方法的合理调用
状态模式用于一个事件或对象有很多状态,状态之间会互相转换,对不同状态有不同的行为的情况
状态模式将不同的情况封装为一个类 这样避免了if/else的多次调用 而且增加新的情况不改变原有代码
这样可以通过只一次判断状态就可以完成相应方法的调用
需要的成员 :
状态类 : 写一个状态类的接口提供基本标准 让不同状态类实现接口 产生不同的状态
活动类 : 写一个活动类组合接口来通过判断状态调用不同行为
以抽奖为例
//状态抽象类 (接口也行)
public abstract class State {
//减少积分
public abstract void deductMoney();
//是否中奖
public abstract boolean raffle();
//发放奖品
public abstract void dispensePrize();
}
//表示可以抽奖的状态
public class CanRaffleState extends State {
RaffleActivity activity = null;
public CanRaffleState(RaffleActivity activity) {
this.activity = activity;
}
@Override
public void deductMoney() {
System.out.println("已经扣除过积分了");
}
@Override
public boolean raffle() {
System.out.println("正在抽奖 请稍等");
Random random = new Random();
int i = random.nextInt(10);
if(i == 0){
activity.setState(activity.getDispenseState());
return true;
} else {
System.out.println("很遗憾没有中奖");
activity.setState(activity.getNoRaffleState());
return false;
}
}
@Override
public void dispensePrize() {
System.out.println("没有抽奖不能中奖");
}
}
///不能抽奖的状态
public class NoRaffleState extends State {
RaffleActivity activity;
public NoRaffleState(RaffleActivity activity){
this.activity = activity;
}
@Override
public void deductMoney() {
System.out.println("扣除50积分成功,你可以抽奖了");
activity.setState(activity.getCanRaffleState());
}
@Override
public boolean raffle() {
System.out.println("扣了积分才可以抽奖");
return false;
}
@Override
public void dispensePrize() {
System.out.println("没有抽奖不能发奖品");
}
}
//发奖的状态
public class DispenseState extends State {
RaffleActivity activity = null;
public DispenseState(RaffleActivity activity) {
this.activity = activity;
}
@Override
public void deductMoney() {
System.out.println("已经扣过积分了");
}
@Override
public boolean raffle() {
System.out.println("已经抽过奖了");
return false;
}
@Override
public void dispensePrize() {
if(activity.count > 0){
System.out.println("恭喜中奖");
activity.getCount();
activity.setState(activity.getNoRaffleState());
} else {
System.out.println("奖品发完了");
activity.setState(activity.getDispensOutState());
}
}
}
//奖品发完的状态
public class DispenseOutState extends State {
RaffleActivity activity = null;
public DispenseOutState(RaffleActivity activity) {
this.activity = activity;
}
@Override
public void deductMoney() {
System.out.println("奖品发完了");
}
@Override
public boolean raffle() {
System.out.println("奖品发完了");
return false;
}
@Override
public void dispensePrize() {
System.out.println("奖品发完了");
}
}
//活动类
public class RaffleActivity{
State state = null;
int count = 0;
State noRaffleState = new NoRaffleState(this);
State canRaffleState = new CanRaffleState(this);
State dispenseState = new DispenseState(this);
State dispensOutState = new DispenseOutState(this);
public RaffleActivity(int count){
this.state = noRaffleState;
this.count = count;
}
public void debuctMoney(){
state.deductMoney();
}
public void raffle(){
if(state.raffle()){
state.dispensePrize();
}
}
public int getCount(){
int curCount = count;
count--;
return curCount;
}
/***************下面getter/setter 不重要**********************************/
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void setCount(int count) {
this.count = count;
}
public State getNoRaffleState() {
return noRaffleState;
}
public void setNoRaffleState(State noRaffleState) {
this.noRaffleState = noRaffleState;
}
public State getCanRaffleState() {
return canRaffleState;
}
public void setCanRaffleState(State canRaffleState) {
this.canRaffleState = canRaffleState;
}
public State getDispenseState() {
return dispenseState;
}
public void setDispenseState(State dispenseState) {
this.dispenseState = dispenseState;
}
public State getDispensOutState() {
return dispensOutState;
}
public void setDispensOutState(State dispensOutState) {
this.dispensOutState = dispensOutState;
}
}
//用户
public class User {
public static void main(String[] args) {
RaffleActivity activity = new RaffleActivity(1);
for(int i = 0 ;i<30;i++){
System.out.println("----第" + (i+1) + "次抽奖----");
activity.debuctMoney();
activity.raffle();
}
}
}