`
wangpx
  • 浏览: 202497 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

state patten 读书笔记

阅读更多

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

1。状态模式允许一个对象基于内部状态而拥有不同的行为。

2。和程序状态机(PSM)不同,状态模式用类代表状态。

3。Context会将行为委托给当前状态对象。

4。通过每个状态封装进一个类,我们把以后需要做的任何改变局部化。

5。状态模式和策略模式有相同的类图,但是他们的意图不同。

6。策略模式通常会用行为或算法来配置Context类。

7。状态模式允许Context随着状态的改变而改变行为。

8。状态转换可以由State类或者Context类控制。

9。使用状态模式通常会导致设计中类的数目大量增加。

10。状态类可以被多个Context实例共享。

package pattern;

import java.util.Random;

public class GumBallMachineTestDrive {
 public static void main(String[] args) {
  GumballMachine gumballMachine = new GumballMachine(5);
  System.out.println(gumballMachine);

  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();

  System.out.println(gumballMachine);

  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();

  System.out.println(gumballMachine);

  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  gumballMachine.ejectQuarter();

  System.out.println(gumballMachine);

  gumballMachine.insertQuarter();
  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  gumballMachine.insertQuarter();
  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  gumballMachine.insertQuarter();
  gumballMachine.turnCrank();
  System.out.println(gumballMachine);

 }
}

interface State {
 public void insertQuarter();

 public void ejectQuarter();

 public void turnCrank();

 public void dispense();
 public void refill(int count);
}

class NoQuarterState implements State {
 GumballMachine gumballMachine;

 public NoQuarterState(GumballMachine gumballMachine) {
  this.gumballMachine = gumballMachine;
 }

 public void insertQuarter() {
  System.out.println("You inserted a quarter");
  gumballMachine.setState(this.gumballMachine.getHasQuarterState());
 }

 public void ejectQuarter() {
  System.out.println("You haven't inserted a quarter");
 }

 public void turnCrank() {
  System.out.println("You need to pay first");
 }

 public void dispense() {
  System.out.println("You need to pay first");
 }
 
 public void refill(int count) {
  System.out.println("need't to refill first");
 }
}

class HasQuarterState implements State {
 Random randomWinner = new Random(System.currentTimeMillis());

 GumballMachine gumballMachine;

 public HasQuarterState(GumballMachine gumballMachine) {
  this.gumballMachine = gumballMachine;
 }

 public void insertQuarter() {
  System.out.println("You can't insert another quarter");
 }

 public void ejectQuarter() {
  System.out.println("Quarter returned");
  this.gumballMachine.setState(this.gumballMachine.getNoQuarterState());
 }

 public void turnCrank() {
  System.out.println("You turned...");
  int winner = randomWinner.nextInt(3);

  if ((winner == 0) && this.gumballMachine.getCount() > 1) {
   System.out.println("winner=" + winner + "    count="
     + this.gumballMachine.getCount());
   this.gumballMachine.setState(this.gumballMachine.getWinnerState());
  } else {
   this.gumballMachine.setState(this.gumballMachine.getSoldState());
  }
 }

 public void dispense() {
  System.out.println("No gumball dispensed");
 }
 public void refill(int count) {
  System.out.println("need't to refill first");
 }
}

class SoldOutState implements State {
 GumballMachine gumballMachine;

 public SoldOutState(GumballMachine gumballMachine) {
  this.gumballMachine = gumballMachine;
 }

 public void insertQuarter() {
  refill(5);
 }

 public void ejectQuarter() {
  System.out.println("There are no a quarter");
 }

 public void turnCrank() {
  refill(5);
 }

 public void dispense() {
  refill(5);
 }
 public void refill(int count) {
  System.out.println("refill 5 count");
  this.gumballMachine.setCount(count);
  this.gumballMachine.setState(this.gumballMachine.getHasQuarterState());
 }
}

class SoldState implements State {
 GumballMachine gumballMachine;

 public SoldState(GumballMachine gumballMachine) {
  this.gumballMachine = gumballMachine;
 }

 public void insertQuarter() {
  System.out.println("Please wait ,we're already giving you a gumball");

 }

 public void ejectQuarter() {
  System.out.println("Sorry ,you already turned the crank");
 }

 public void turnCrank() {
  System.out.println("Turning twice doesn't get you another gumball!");
 }

 public void dispense() {
  this.gumballMachine.releaseBall();
  if (this.gumballMachine.getCount() > 0) {
   this.gumballMachine.setState(this.gumballMachine
     .getNoQuarterState());
  } else {
   System.out.println("Oops, out of gumballs");
   this.gumballMachine.setState(this.gumballMachine.getSoldOutState());
  }
 }
 public void refill(int count) {
  System.out.println("need't to refill first");
 }
}

class WinnerState implements State {
 GumballMachine gumballMachine;

 public WinnerState(GumballMachine gumballMachine) {
  this.gumballMachine = gumballMachine;
 }

 public void insertQuarter() {
  System.out.println("Please wait ,we're already giving you a gumball");

 }

 public void ejectQuarter() {
  System.out.println("Sorry ,you already turned the crank");
 }

 public void turnCrank() {
  System.out.println("Turning twice doesn't get you another gumball!");
 }

 public void dispense() {
  System.out
    .println("YOU'RE A WINNER! You get two gumballs for your quarter");
  this.gumballMachine.releaseBall();
  if (this.gumballMachine.getCount() == 0) {
   this.gumballMachine.setState(this.gumballMachine.getSoldOutState());
  } else {
   this.gumballMachine.releaseBall();
   if (this.gumballMachine.getCount() > 0) {
    this.gumballMachine.setState(this.gumballMachine
      .getNoQuarterState());

   } else {
    System.out.println("Oops, out of gumballs");
    this.gumballMachine.setState(this.gumballMachine
      .getSoldOutState());
   }
  }
 }
 public void refill(int count) {
  System.out.println("need't to refill first");
 }
}

class GumballMachine {
 State soldOutState;
 State noQuarterState;
 State hasQuarterState;
 State soldState;
 State state;
 State winnerState;
 int count = 0;

 public GumballMachine(int numberGumballs) {
  soldOutState = new SoldOutState(this);
  noQuarterState = new NoQuarterState(this);
  hasQuarterState = new HasQuarterState(this);
  soldState = new SoldState(this);
  winnerState = new WinnerState(this);
  this.count = numberGumballs;
  if (numberGumballs > 0) {
   state = noQuarterState;
  }
 }

 public void insertQuarter() {
  state.insertQuarter();
 }

 public void ejectQuarter() {
  state.ejectQuarter();
 }

 public void turnCrank() {
  state.turnCrank();
  state.dispense();
 }

 void setState(State state) {
  this.state = state;
 }

 public String toString() {
  System.out.println(this.getState());

  return this.getState().toString();
 }

 void releaseBall() {
  System.out.println("A gumball come rolling out the slot ...");
  if (count != 0) {
   count = count - 1;
  }
 }

 public State getSoldOutState() {
  return soldOutState;
 }

 public void setSoldOutState(State soldOutState) {
  this.soldOutState = soldOutState;
 }

 public State getNoQuarterState() {
  return noQuarterState;
 }

 public void setNoQuarterState(State noQuarterState) {
  this.noQuarterState = noQuarterState;
 }

 public State getHasQuarterState() {
  return hasQuarterState;
 }

 public void setHasQuarterState(State hasQuarterState) {
  this.hasQuarterState = hasQuarterState;
 }

 public State getSoldState() {
  return soldState;
 }

 public void setSoldState(State soldState) {
  this.soldState = soldState;
 }

 public int getCount() {
  return count;
 }

 public void setCount(int count) {
  this.count = count;
 }

 public State getState() {
  return state;
 }

 public State getWinnerState() {
  return winnerState;
 }

public void setWinnerState(State winnerState) {
  this.winnerState = winnerState;
 }
}

  • 大小: 49.5 KB
分享到:
评论
1 楼 pan19849529 2008-05-20  
:?:

相关推荐

    良葛格DesignPattern学习笔记

    良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...

    java源码解读-DesignPattern:Android源码设计模式解析与实战读书笔记源代码

    Android源码设计模式解析与实战读书笔记源代码 说明: 包名factorypattern.normal表示的是工厂方法模式的普通用法 包名factorypattern.practices表示的是工厂方法模式的常用 包名observerpattern表示的是观察者模式...

    Gof design pattern 中文/英文版+web+学习笔记

    18. **状态模式(State)**:允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 19. **策略模式(Strategy)**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让...

    300Java设计模式部分学习笔记

    9. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为。 10. 观察者模式(Observer Pattern):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到...

    设计模式整理代码-pattern.zip

    - 状态模式(State):允许对象在其内部状态改变时改变它的行为,看起来像改变了它的类。 - 策略模式(Strategy):定义一系列算法,并将每个算法封装起来,使它们可以相互替换,策略对象改变算法的选用。 - 模板...

    Head First 设计模式学习笔记(十四)模式的组合使用

    6. **状态模式(State Pattern)**:Duck对象可能根据其当前状态(如飞、叫等)执行不同的行为,这可能是状态模式的应用。状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。 通过...

    java设计模式笔记_行为模式借鉴.pdf

    备忘录模式(Memento Pattern)是一种行为设计模式,它的主要目的是在不破坏对象封装性的前提下,捕获一个对象的内部状态,并能在未来恢复这个状态。这种模式常用于需要记录历史状态或撤销/重做操作的场景。 在备忘...

    DesignPattern:设计模式的学习笔记和示例代码

    设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的经验总结。...在DesignPattern-master这个压缩包中,你可以找到关于这些模式的详细讲解和实例代码,为你的Java开发之旅提供宝贵的参考资料。

    ansuble笔记

    ansible all -m cron -a "name=synctimefromntp user=root state=present minute='*/10' job=\"/sbin/ntpdate 182.16.0.1 &>/dev/null\"" ``` 删除定时任务: ```bash ansible all -m cron -a "name=...

    power:电源管理并在笔记本电脑的盖子上悬挂以关闭SumpWM

    通过上位机进行功率控制的实用程序 特征 在stumpwm的笔记本电脑关闭上挂起。... 盖状态的默认打开方式为“状态:\ s +打开” *lid-state-open-pattern* 默认盖状态打开模式为“状态:\ s +关闭” *l

    SD卡协议学习点滴学习笔记

    3. 如果SD卡可以在指定电压下工作,那么它会回应CMD8的命令响应字,其中包含了**checkvoltage**和**check pattern**信息。若SD卡不支持该电压,则不会作出任何响应并继续保持在空闲状态。 4. 在物理层版本2.0(PLV...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

Global site tag (gtag.js) - Google Analytics