/**
* 状态模式
* @author TMAC-J
* 状态模式和策略模式很像,其实仔细研究发现完全不一样
* 策略模式各策略之间没有任何关系,独立的
* 状态模式各状态之间接口方法都是一样的
* 另外一个区别是状态模式主要用于状态经常发生改变的情况
* 策略模式发生在不改变的情况,策略模式一般在CONTEXT初始化时就决定了,并且中途不会改变
* 换句话说,策略模式只是在对象初始化的时候更改执行模式,而状态模式是根据对象实例的周期时间而动态地改变对象实例的执行模式。
* 状态模式的方法都是固定的,策略模式有不同的策略,可以随意些不同方法
* key:策略模式是可以扩展不同的策略算法,而状态模式是以继承代替if-else,可以扩展不同
* 情况,他能做的事情是固定不变的!
* if-else特别多的时候用这种方式
*/
public class StatePattern {
/**
* 这个接口负责定义所有的方法
* 功能在这个接口加
*/
interface State{
void preChannel();
void nextChannel();
void turnon();
void turndown();
} public class PoweronState implements State{ @Override
public void preChannel() {
System.out.println("pre");
} @Override
public void nextChannel() {
System.out.println("next");
} @Override
public void turnon() {
System.out.println("turnon");
} @Override
public void turndown() {
System.out.println("turnoff");
} } public class PoweroffState implements State{
/**
* 关机状态不做任何操作
*/
@Override
public void preChannel() {
// TODO Auto-generated method stub } @Override
public void nextChannel() {
// TODO Auto-generated method stub } @Override
public void turnon() {
// TODO Auto-generated method stub } @Override
public void turndown() {
// TODO Auto-generated method stub } }
/**
* 这个接口负责定义不同状态
* 状态在这个接口加
*/
interface PowerController{ void poweron(); void poweroff(); }
/**
* 需要写明不同的方法和不同的状态
*
*/
public class TVController implements PowerController{ private State state; public void setState(State state){
this.state = state;
} @Override
public void poweron() {
setState(new PoweronState());
} @Override
public void poweroff() {
setState(new PoweroffState());
} public void preChannel() {
state.preChannel();
} public void nextChannel() {
state.nextChannel();
} public void turnon() {
state.turnon();
} public void turndown() {
state.turndown();
}
} public class Client{
public void test(){
TVController tvController = new TVController();//这个时候只需要创建这个控制类就够啦
tvController.setState(new PoweronState());//传递状态,相当于if
/**
* 下面这四个直接写就可以了,不用管什么状态了,是不是很爽,到时候如果有不同的状态加入的话
* 只需要在控制器接口中添加相应的方法,或者是在写一个接口让控制器实现就可以啦
* 其他的都不用管!!!
*/
tvController.preChannel();
tvController.nextChannel();
tvController.turnon();
tvController.turndown();;
}
} }

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. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  2. 实时的.NET程序错误监控产品Exceptionless

    Exceptionless可以对ASP.NET, Web API, WebForms, WPF, Console, 和 MVC 应用提供错误监控.上传.报表服务.使用时需要在Exceptionless ...

  3. WPF 微信 MVVM 【续】修复部分用户无法获取列表

    看过我WPF 微信 MVVM这篇文章的朋友,应该知道我里面提到了我有一个小号是无法获取列表的,始终也没找到原因. 前两天经过GitHub上h4dex大神的指导,知道了原因,是因为微信在登录以后,web ...

  4. 两个 viewports 的故事-第二部分

    原文链接:A tale of two viewports — part two 译者:nzbin 在这个迷你系列中,我将解释 viewports 和各种重要元素的宽度是如何工作的,比如说 <ht ...

  5. 从netty-example分析Netty组件

    分析netty从源码开始 准备工作: 1.下载源代码:https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程. netty提 ...

  6. php 基础代码大全(不断完善中)

    下面是基础的PHP的代码,不断完善中~ //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线 ...

  7. TemplateMethod(模块方法模式)

    /** * 模块模式 * @author TMAC-J * 将一个完整的算法分离,分成不同的模块 * 用于有很多步骤的时候,可能以后这些步骤还会增加,把这些步骤分离 * 将有共性的部分放在抽象类中 * ...

  8. css样式之border-image

    border-image-source 属性设置边框的图片的路径[none | <image>] div { border: 20px solid #000; border-image-s ...

  9. 似懂非懂的localStorage和sessionStorage

    一.区别 相信很多人都见过这两个关于HTML5的新名词!HTML5种的web storage包含两种存储方式:localStorage和sessionStorage,这两种方式存储的数据不会自动发给服 ...

  10. 微信小程序服务范围重大更新

    12.29日,小程序服务范围做了重大更新,增对富媒体和工具类型的小程序,增加了很多细分领域 富媒体:增加资讯,FM电台,有声读物等,媒体平台可上小程序了 工具:信息查询,网络代理,健康,企业管理等 , ...