在软件开发过程中。应用程序可能会依据不同的情况作出不同的处理。

最直接的解决方式是将这些全部可能发生的情况全都考虑到。然后使用if... ellse语句来做状态推断来进行不同情况的处理。

可是对复杂状态的推断就显得“力不从心了”。

随着添加新的状态或者改动一个状体(if else(或switch case)语句的增多或者改动)可能会引起非常大的改动,而程序的可读性,扩展性也会变得非常弱。维护也会非常麻烦。

那么我就考虑仅仅改动自身状态的模式。————题记

设计模式
状态模式:同意对象在内部状态改变时改变他的行为,对象看起来好像改动了它的类。
这个模式将状态封装称为独立的类,并将动作托付到代表当前状态的对象。我们知道行为会随着内部状态而改变。
设计原则
封装变化
多用组合。少用继承
针对接口编程,不针对实现编程
为交互对象之间松耦合设计而努力
类应该对扩展开发。对改动关闭
依赖抽象,不依赖详细类
仅仅和朋友交谈
别找我,我会找你
类应该仅仅有一个改变的理由
要点
状态模式同意一个对象基于内部状态而拥有不同的行为。
和程序状态机不同,状态模式用类代表状态。
策略模式一般会用行为或算法来配置context类,状态模式同意context随着状态改变而改变行为。状态转变能够由state类或context类控制。
使用状态模式会导致设计模式中类的数目大量添加。
状态类能够被多个context共享。
模型匹配
状态模型          封装基于状态的行为,并将行为托付到当前状态
策略模型          将能够互换的行为封装起来,然后使用托付的方法,决定使用哪一个行为。
模板方法模型    由子类决定实现算法的某些步骤
何时使用?
State模式在实际使用中比較多,适合"状态的切换".由于我们常常会使用If elseif else 进行状态切换, 假设针对状态的这样推断切换重复出现,我们就要联想到能否够採取State模式了.
不仅仅是依据状态,也有依据属性.假设某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比較高,我们常常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这样的属性的改变(切换)又是随时可能发生的,就有可能要使用State.
状态模式:

//状态接口
public interface State {public void insertQuarter();public void ejectQuarter();public void turnCrank();public void dispense();
}//实现状态接口
public 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(gumballMachine.getHasQuarterState());}public void ejectQuarter() {System.out.println("You haven't inserted a quarter");}public void turnCrank() {System.out.println("You turned, but there's no quarter");}public void dispense() {System.out.println("You need to pay first");} public String toString() {return "waiting for quarter";}
}public 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");gumballMachine.setState(gumballMachine.getNoQuarterState());}public void turnCrank() {System.out.println("You turned...");//决定这名顾客是否赢了int winner = randomWinner.nextInt(10);if ((winner == 0) && (gumballMachine.getCount() > 1)) {gumballMachine.setState(gumballMachine.getWinnerState());} else {gumballMachine.setState(gumballMachine.getSoldState());}}public void dispense() {System.out.println("No gumball dispensed");}public String toString() {return "waiting for turn of crank";}
}//实现糖果机
public class GumballMachine {//全部的状态都在这里State soldOutState;State noQuarterState;State hasQuarterState;State soldState;State winnerState;State state = soldOutState;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;}void releaseBall() {System.out.println("A gumball comes rolling out the slot...");if (count != 0) {count = count - 1;}}int getCount() {return count;}void refill(int count) {this.count = count;state = noQuarterState;}public State getState() {return state;}public State getSoldOutState() {return soldOutState;}public State getNoQuarterState() {return noQuarterState;}public State getHasQuarterState() {return hasQuarterState;}public State getSoldState() {return soldState;}public State getWinnerState() {return winnerState;}public String toString() {StringBuffer result = new StringBuffer();result.append("\nMighty Gumball, Inc.");result.append("\nJava-enabled Standing Gumball Model #2004");result.append("\nInventory: " + count + " gumball");if (count != 1) {result.append("s");}result.append("\n");result.append("Machine is " + state + "\n");return result.toString();}
}package net.dp.state.gumballstatewinner;public class GumballMachineTestDrive {public static void main(String[] args) {GumballMachine gumballMachine = new GumballMachine(10);System.out.println(gumballMachine);gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.insertQuarter();gumballMachine.turnCrank();//再在转动运行多次}
}

《Head First 设计模式》学习笔记——状态模式相关推荐

  1. 设计模式学习笔记-状态模式

    引言 使用该设计模式的情况:如在场景中的主角甚至是敌人,有N个不同状态:走路,攻击,待机.....,游戏中,这些状态来回切换.有一个明确的状态划分的情况下,此时,是可以使用Switch...case. ...

  2. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  3. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  4. 设计模式学习笔记——外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

  5. 设计模式学习笔记-原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象: 二.模式中的角色 Prototype:声明一个克隆自身的接口: ConcretePrototype:实现一个克隆自身的操作: ...

  6. 设计模式学习笔记-中介模式

    概述:                                                                                                 ...

  7. 设计模式学习笔记——命令模式(Command)

    1.特点:将请求发送者与具体实现者解耦,可对请求排列.取消.重做,支持事务.(多请求,单处理) 2.概念:属于对象的行为模式[GOF95].命令模式又称为行动(Action)模式或交易(Transac ...

  8. 设计模式学习笔记-代理模式

    1. 概述 为其它对象提供一种代理以控制对这个对象的访问. 解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题.这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互 ...

  9. 设计模式学习笔记——命令模式

    请求发送者与请求接收者之间,隔着一个命令,这就是命令模式. 为什么要在中间搞一个命令对象作为中介? 请求发送者直接调用接收者不行吗?如果为方便替换,符合开闭原则,可以针对接口编程,弄一个请求接收者接口 ...

最新文章

  1. MySQL外键设置中的的 Cascade、Restrict、SET NULL 、NO ACTION
  2. 一个非常超级可爱的滚动到顶端(Back to top)的jQuery插件- jQuery Back to Top
  3. [转]百万数据查询优化技巧三四则
  4. 请设计各种管理系统、业务系统的大哥大姐们,设计新系统时,拜托您,请允许我修改用户名、密码...
  5. Linux Shell脚本入门教程系列之(十一)Shell while循环
  6. java azure blobs sas_使用 Java 的 Azure 存储示例 | Azure Docs
  7. jdk678910新特性地址
  8. 3 矩阵运算_FlyAI小课堂:小白学PyTorch(11) 常见运算详解
  9. Julia: DataFrame最大的好处是对NA的处理和对象化操作!
  10. UCOS操作系统——创建与删除任务(三)
  11. 登录服务器的详细步骤
  12. WebView下载点击无反应问题
  13. 齐次线性方程组与非齐次线性方程组的区别
  14. WIN11右键菜单默认展开
  15. 小伙面试时被连环追问数据库优化, 面试前如何埋点反杀? 网友看完直呼: 太硬核了!
  16. 解决kettle部署在linux中界面变成英文的问题
  17. redisson + CacheManager缓存管理
  18. ubantu查看设备序列号
  19. 计算机网络安全(1)
  20. 哈哈!12万行代码堆出来个「蔡徐坤」

热门文章

  1. activiti 条件表达式json报错_2020年2月13日学习python 条件控制
  2. 概率论-3.5 条件分布与条件期望
  3. JAVA操作HDFS API(hadoop)
  4. 自编码器及其相关模型
  5. [Swift]LeetCode793. 阶乘函数后K个零 | Preimage Size of Factorial Zeroes Function
  6. leetcode 152. Maximum Product Subarry
  7. Web公路,新手上路!NO.2 [ 基础标签(一)]
  8. Radical and array
  9. Understanding Java class loading - part 2
  10. s3c44b0x开发板之BOOT ROM配置