二十三种设计模式之状态模式
来源:互联网 发布:java行业 编辑:程序博客网 时间:2024/05/17 21:58
状态模式:能根据内部状态变化,改变对象的行为,看起来好像修改了类.
使用场景:
public interface State {
public void insertCoin();
public void returnCoin();
public void turnCrank();
public void dispense();
public void printstate();
}
public class OnReadyState implements State{
private CandyMachine mCandyMachine;
public OnReadyState(CandyMachine candyMachine) {
this.mCandyMachine = candyMachine;
}
@Override
public void insertCoin() {
System.out.println("you have inserted a coin,next,please turn crank!");
mCandyMachine.setState(mCandyMachine.mHasCoin);
}
@Override
public void returnCoin() {
System.out.println("you haven't insterted a coin yet!");
}
@Override
public void turnCrank() {
System.out.println("you turned ,but you haven't inserted a coin!");
}
@Override
public void dispense() {
// TODO Auto-generated method stub
}
@Override
public void printstate() {
System.out.println("*****OnReadyState*****");
}
}
public class HasCoin implements State{
private CandyMachine candyMachine;
public HasCoin(CandyMachine candyMachine) {
this.candyMachine = candyMachine;
}
@Override
public void insertCoin() {
System.out.println("you can't insert another coin!");
}
@Override
public void returnCoin() {
System.out.println("coin return!");
candyMachine.setState(candyMachine.mOnReadyState);
}
@Override
public void turnCrank() {
System.out.println("crank turn ... !");
Random ranwinner = new Random();
int winner = ranwinner.nextInt(10);
if(winner == 0){
candyMachine.setState(candyMachine.mWinnerState);
}else{
candyMachine.setState(candyMachine.mSoldState);
}
}
@Override
public void dispense() {
// TODO Auto-generated method stub
}
@Override
public void printstate() {
System.out.println("*********HasCoin*******");
}
}
public class SoldState implements State{
private CandyMachine candyMachine;
public SoldState(CandyMachine candyMachine) {
this.candyMachine = candyMachine;
}
@Override
public void insertCoin() {
System.out.println("please wait!we are giving you a candy!");
}
@Override
public void returnCoin() {
System.out.println("you haven't inserted a coin yet!");
}
@Override
public void turnCrank() {
System.out.println("we are giving you a candy,turning another get nothing");
}
@Override
public void dispense() {
candyMachine.releaseCandy();
if(candyMachine.getCount()>0){
candyMachine.setState(candyMachine.mOnReadyState);
}else{
System.out.println("Oo,out of candies");
candyMachine.setState(candyMachine.mSoldOutState);
}
}
@Override
public void printstate() {
System.out.println("*********SoldState*******");
}
}
public class WinnerState implements State{
private CandyMachine candyMachine;
public WinnerState(CandyMachine candyMachine) {
this.candyMachine = candyMachine;
}
@Override
public void insertCoin() {
System.out.println("please wait!we are giving you a candy!");
}
@Override
public void returnCoin() {
System.out.println("you haven't inserted a coin yet!");
}
@Override
public void turnCrank() {
System.out.println("we are giving you a candy,turning another get nothing");
}
@Override
public void dispense() {
candyMachine.releaseCandy();
if(candyMachine.getCount()==0){
candyMachine.setState(candyMachine.mSoldOutState);
}else{
System.out.println("you are a winner!you get another candy!");
candyMachine.releaseCandy();
if(candyMachine.getCount()>0){
candyMachine.setState(candyMachine.mOnReadyState);
}else{
System.out.println("Oo,out of candies");
candyMachine.setState(candyMachine.mSoldOutState);
}
}
}
@Override
public void printstate() {
System.out.println("*********WinnerState*******");
}
}
public class SoldOutState implements State{
private CandyMachine candyMachine;
public SoldOutState(CandyMachine candyMachine) {
this.candyMachine = candyMachine;
}
@Override
public void insertCoin() {
// TODO Auto-generated method stub
System.out.println("you can't insert coin,the machine sold out!");
}
@Override
public void returnCoin() {
System.out.println("you can't return,you have't inserted a coin yet!");
}
@Override
public void turnCrank() {
System.out.println("you turned ,but there are no candies!");
}
@Override
public void dispense() {
// TODO Auto-generated method stub
}
@Override
public void printstate() {
System.out.println("*********SoldOutState*******");
}
}
public class CandyMachine {
State mSoldOutState;
State mOnReadyState;
State mHasCoin;
State mSoldState;
State mWinnerState;
private State state;
private int count = 0;
public CandyMachine(int count) {
this.count = count;
mSoldOutState = new SoldOutState(this);
mOnReadyState = new OnReadyState(this);
mHasCoin = new HasCoin(this);
mSoldState = new SoldState(this);
mWinnerState = new WinnerState(this);
if(count > 0){
state = mOnReadyState;
}else{
state = mSoldOutState;
}
}
public void setState(State state) {
this.state = state;
}
public void insertCoin(){
state.insertCoin();
}
public void returnCoin() {
state.returnCoin();
}
public void turnCrank(){
state.turnCrank();
state.dispense();
}
void releaseCandy(){
if(count > 0){
count = count - 1;
System.out.println(" a candy rolling out!");
}
}
public int getCount(){
return count;
}
public void printState(){
state.printstate();
}
}
public class MainTest {
public static void main(String[] args) {
CandyMachine candyMachine = new CandyMachine(6);
candyMachine.printState();
candyMachine.insertCoin();
candyMachine.printState();
candyMachine.turnCrank();
candyMachine.printState();
candyMachine.insertCoin();
candyMachine.printState();
candyMachine.insertCoin();
candyMachine.turnCrank();
}
}
- 二十三种设计模式之状态模式
- Java设计模式之二十三(状态模式)
- 二十三种设计模式之行为型模式之状态模式
- 二十三 设计模式之桥梁模式
- [设计模式]二十三种设计模式
- 二十三种设计模式之观察者模式简述
- 二十三种设计模式之单例模式
- 二十三种设计模式之装饰者模式
- 二十三种设计模式之工厂模式
- 二十三种设计模式之命令模式
- 二十三种设计模式之适配器模式
- 二十三种设计模式之外观模式
- 二十三种设计模式之模板模式
- 二十三种设计模式之迭代器模式
- 二十三种设计模式之组合模式
- 二十三种设计模式之代理模式(一)
- 二十三种设计模式之桥接模式
- 二十三种设计模式之生成器模式
- React-Native--多图选择上传
- slf4j中的MDC
- RN开发实践——仿携程App(一)
- 二分模板
- 服务器安装后的系统优化
- 二十三种设计模式之状态模式
- hive 客户端连接hive server出现Query returned non-zero code: 10001 SemanticException
- windows64上python2.7连接mysql
- 关于对SWS插件的一些扩展
- Springboot 集成阿里短信 ClassNotFound的坑
- Android 获取ROOT权限原理解析
- Accelerate the downloading of docker images through Ali
- Vue 组件库实践和设计
- vtk 通过指针实时刷新界面