设计模式之状态设计模式
设计模式 Java About 2,265 words作用
解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。
当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
应用场景:当一个事件或者对象有很多种状态,状态之间会相互转换,对不同的状态要求有不同的行为的时候,可以考虑使用状态模式。
原理
Context:环境角色,用于维护State实例,这个实例定义当前状态。
State:抽象状态角色,定义一个接口封装与Context的一个特点接口相关行为。
ConcreteState:具体的状态角色,每个子类实现一个与Context的一个状态相关行为。
案例
状态转换关系图
Context
public class Raffle {
int count = 10;
State state;
public Raffle(State state) {
this.state = state;
}
public void next() {
state.handle(this);
}
public void setState(State state) {
this.state = state;
next();
}
}
State
public interface State {
void handle(Raffle raffle);
}
ConcreteState
public class NoRaffleState implements State {
@Override
public void handle(Raffle raffle) {
if (raffle.count > 0) {
System.out.println("NoRaffleState-可以抽奖");
raffle.setState(new CanRaffleState());
} else {
System.out.println("NoRaffleState: 奖品已经领完");
}
}
}
public class CanRaffleState implements State {
@Override
public void handle(Raffle raffle) {
System.out.println("CanRaffleState-正在抽奖,请稍等!");
Random r = new Random();
int num = r.nextInt(10);
if (num == 0) {
System.out.println("CanRaffleState-中奖了!!!!!!");
raffle.setState(new DispensePrizeState());
} else {
System.out.println("CanRaffleState-很遗憾没有抽中奖品!");
raffle.setState(new NoRaffleState());
}
}
}
public class DispensePrizeState implements State {
@Override
public void handle(Raffle raffle) {
if (raffle.count > 0) {
System.out.println("DispensePrizeState-发奖");
raffle.count--;
} else {
System.out.println("DispensePrizeState-奖品已经领完了");
raffle.setState(new DispenseOverState());
}
}
}
public class DispenseOverState implements State {
@Override
public void handle(Raffle raffle) {
System.out.println("DispenseOverState-奖品已经领完了");
raffle.setState(new NoRaffleState());
}
}
调用
public class Client {
public static void main(String[] args) {
Raffle raffle = new Raffle(new NoRaffleState());
raffle.next();
}
}
Views: 2,394 · Posted: 2020-01-07
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...