/**
* 状态模式
* @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. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  2. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  3. 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)

    统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...

  4. Newtonsoft.Json设置类的属性不序列化

    参考页面: http://www.yuanjiaocheng.net/webapi/parameter-binding.html http://www.yuanjiaocheng.net/webapi ...

  5. C# 数组的交集、差集、并集

    C# 数组的交集.差集.并集 工作中经常会用这方面的知识来检查那些字段是必须输入的,那些是禁止输入. using System; using System.Collections.Generic; u ...

  6. EC笔记:第4部分:20、传递引用代替传值

    考虑以下场景: #include <iostream> #include <string> using namespace std; struct Person { strin ...

  7. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

  8. NodeJS使用mysql

    1.环境准备 手动添加数据库依赖: 在package.json的dependencies中新增, "mysql" : "latest", { "nam ...

  9. weinre- 调试移动端页面

    相信很多前端的小伙伴一定会遇到一个问题, 比如我编写完一个页面,某个地方需要进行调整细节或者是哪个地方怎么调整都不对,在pc端还好,有google,firefox之类可以调节页面的工具,虽说这些工具有 ...

  10. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...