/**
* 状态模式
* @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. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  2. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  3. Twproject Gantt开源甘特图功能扩展

    1.Twproject Gantt甘特图介绍 Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CS ...

  4. 代码的坏味道(22)——不完美的库类(Incomplete Library Class)

    坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...

  5. Android中的LinearLayout布局

    LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了,  线性布局是按照垂直方向(vertical)或水平方向 ...

  6. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  7. Flume1 初识Flume和虚拟机搭建Flume环境

    前言:       工作中需要同步日志到hdfs,以前是找运维用rsync做同步,现在一般是用flume同步数据到hdfs.以前为了工作简单看个flume的一些东西,今天下午有时间自己利用虚拟机搭建了 ...

  8. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  9. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  10. Leetcode 笔记 116 - Populating Next Right Pointers in Each Node

    题目链接:Populating Next Right Pointers in Each Node | LeetCode OJ Given a binary tree struct TreeLinkNo ...