1. /**
  2. * 状态模式
  3. * @author TMAC-J
  4. * 状态模式和策略模式很像,其实仔细研究发现完全不一样
  5. * 策略模式各策略之间没有任何关系,独立的
  6. * 状态模式各状态之间接口方法都是一样的
  7. * 另外一个区别是状态模式主要用于状态经常发生改变的情况
  8. * 策略模式发生在不改变的情况,策略模式一般在CONTEXT初始化时就决定了,并且中途不会改变
  9. * 换句话说,策略模式只是在对象初始化的时候更改执行模式,而状态模式是根据对象实例的周期时间而动态地改变对象实例的执行模式。
  10. * 状态模式的方法都是固定的,策略模式有不同的策略,可以随意些不同方法
  11. * key:策略模式是可以扩展不同的策略算法,而状态模式是以继承代替if-else,可以扩展不同
  12. * 情况,他能做的事情是固定不变的!
  13. * if-else特别多的时候用这种方式
  14. */
  15. public class StatePattern {
  16. /**
  17. * 这个接口负责定义所有的方法
  18. * 功能在这个接口加
  19. */
  20. interface State{
  21. void preChannel();
  22. void nextChannel();
  23. void turnon();
  24. void turndown();
  25. }
  26.  
  27. public class PoweronState implements State{
  28.  
  29. @Override
  30. public void preChannel() {
  31. System.out.println("pre");
  32. }
  33.  
  34. @Override
  35. public void nextChannel() {
  36. System.out.println("next");
  37. }
  38.  
  39. @Override
  40. public void turnon() {
  41. System.out.println("turnon");
  42. }
  43.  
  44. @Override
  45. public void turndown() {
  46. System.out.println("turnoff");
  47. }
  48.  
  49. }
  50.  
  51. public class PoweroffState implements State{
  52. /**
  53. * 关机状态不做任何操作
  54. */
  55. @Override
  56. public void preChannel() {
  57. // TODO Auto-generated method stub
  58.  
  59. }
  60.  
  61. @Override
  62. public void nextChannel() {
  63. // TODO Auto-generated method stub
  64.  
  65. }
  66.  
  67. @Override
  68. public void turnon() {
  69. // TODO Auto-generated method stub
  70.  
  71. }
  72.  
  73. @Override
  74. public void turndown() {
  75. // TODO Auto-generated method stub
  76.  
  77. }
  78.  
  79. }
  80. /**
  81. * 这个接口负责定义不同状态
  82. * 状态在这个接口加
  83. */
  84. interface PowerController{
  85.  
  86. void poweron();
  87.  
  88. void poweroff();
  89.  
  90. }
  91. /**
  92. * 需要写明不同的方法和不同的状态
  93. *
  94. */
  95. public class TVController implements PowerController{
  96.  
  97. private State state;
  98.  
  99. public void setState(State state){
  100. this.state = state;
  101. }
  102.  
  103. @Override
  104. public void poweron() {
  105. setState(new PoweronState());
  106. }
  107.  
  108. @Override
  109. public void poweroff() {
  110. setState(new PoweroffState());
  111. }
  112.  
  113. public void preChannel() {
  114. state.preChannel();
  115. }
  116.  
  117. public void nextChannel() {
  118. state.nextChannel();
  119. }
  120.  
  121. public void turnon() {
  122. state.turnon();
  123. }
  124.  
  125. public void turndown() {
  126. state.turndown();
  127. }
  128. }
  129.  
  130. public class Client{
  131. public void test(){
  132. TVController tvController = new TVController();//这个时候只需要创建这个控制类就够啦
  133. tvController.setState(new PoweronState());//传递状态,相当于if
  134. /**
  135. * 下面这四个直接写就可以了,不用管什么状态了,是不是很爽,到时候如果有不同的状态加入的话
  136. * 只需要在控制器接口中添加相应的方法,或者是在写一个接口让控制器实现就可以啦
  137. * 其他的都不用管!!!
  138. */
  139. tvController.preChannel();
  140. tvController.nextChannel();
  141. tvController.turnon();
  142. tvController.turndown();;
  143. }
  144. }
  145.  
  146. }

StatePattern(状态模式)的更多相关文章

  1. StatePattern(状态模式)-----Java/.Net

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context ...

  2. 设计模式のStatePattern(状态模式)----行为模式

    一.产生背景 在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代 ...

  3. C#设计模式系列:状态模式(State)

    1.状态模式简介 1.1>.定义 状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为. 状态模式的针对性很强,当有状态变化的时候可以选择状态模式. 1. ...

  4. JAVA 设计模式 状态模式

    用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构

  5. 深入浅出设计模式——状态模式(State Pattern)

    模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...

  6. CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)

    模式角色与结构: 示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换.状态模式一定程度上违背开闭原则) using System; using System.Collectio ...

  7. Head First设计模式之状态模式

    一.定义 定义:允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:代码中包含大量 ...

  8. 十九、State 状态模式

    原理: 代码清单: Context public interface Context { void setClock(int hour); void changeState(State state); ...

  9. 设计模式之状态模式(State Pattern)

    一.什么是状态模式? 把所有动作都封装在状态对象中,状态持有者将行为委托给当前状态对象 也就是说,状态持有者(比如汽车,电视,ATM机都有多个状态)并不知道动作细节,状态持有者只关心自己当前所处的状态 ...

随机推荐

  1. Unity3d学习 预设体(prefab)的一些理解

    之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题! 预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象. 创建预设体 ...

  2. 移动站应该尝试百度MIP的五个原因

    MIP是什么?MIP是百度在2016年提出的移动网页加速器项目. MIP能做什么?MIP能帮助站长和网站开发者快速搭建移动端页面. MIP怎么加速?MIP从前端渲染和页面网络传输两方面进行优化,杜绝页 ...

  3. JS里面Data日期格式转换

    var format = function(time, format){     var t = new Date(time);     var tf = function(i){return (i  ...

  4. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的

    题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...

  5. 最长回文子串-LeetCode 5 Longest Palindromic Substring

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  6. 要想提高PHP的编程效率,你必须知道的要点

    1.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数.此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储 ...

  7. Axure 8.0.0.3312可用注册码

    用户名:aaa 注册码:2GQrt5XHYY7SBK/4b22Gm4Dh8alaR0/0k3gEN5h7FkVPIn8oG3uphlOeytIajxGU 用户名:axureuser 序列号:8wFfI ...

  8. RabbitMQ + PHP (一)入门与安装

    RabbitMQ: 1.是实现AMQP(高级消息队列协议)的消息中间件的一种. 2.主要是为了实现系统之间的双向解耦而实现的.当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层.保存这个数 ...

  9. 深入理解DOM节点操作

    × 目录 [1]创建节点 [2]插入节点 [3]移除节点[4]替换节点[5]复制节点 前面的话 一般地,提起操作会想到“增删改查”这四个字,而DOM节点操作也类似地对应于此,接下来将详细介绍DOM的节 ...

  10. linux-图形化远程管理协议

    远程管理控制方式: RDP(remote desktop protocol)协议: telnet: SSH(Secure Shell): RFB(Remote FrameBuffer)协议(图形化远程 ...