StatePattern(状态模式)
/**
* 状态模式
* @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(状态模式)的更多相关文章
- StatePattern(状态模式)-----Java/.Net
在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context ...
- 设计模式のStatePattern(状态模式)----行为模式
一.产生背景 在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代 ...
- C#设计模式系列:状态模式(State)
1.状态模式简介 1.1>.定义 状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为. 状态模式的针对性很强,当有状态变化的时候可以选择状态模式. 1. ...
- JAVA 设计模式 状态模式
用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构
- 深入浅出设计模式——状态模式(State Pattern)
模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...
- CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)
模式角色与结构: 示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换.状态模式一定程度上违背开闭原则) using System; using System.Collectio ...
- Head First设计模式之状态模式
一.定义 定义:允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:代码中包含大量 ...
- 十九、State 状态模式
原理: 代码清单: Context public interface Context { void setClock(int hour); void changeState(State state); ...
- 设计模式之状态模式(State Pattern)
一.什么是状态模式? 把所有动作都封装在状态对象中,状态持有者将行为委托给当前状态对象 也就是说,状态持有者(比如汽车,电视,ATM机都有多个状态)并不知道动作细节,状态持有者只关心自己当前所处的状态 ...
随机推荐
- 通俗易懂的来讲讲DOM
DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的“遗忘”了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或缺的,所以本文力图系 ...
- SQL Server 常用内置函数(built-in)持续整理
本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...
- 清空Github上某个文件的历史版本
title: 清空Github上某个文件的历史版本 author: 青南 date: 2015-01-08 16:04:53 categories: [经验] tags: [Github,histor ...
- angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable
大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...
- 【Reading Note】Python读书杂记
赋值 >>> list=[] >>> app=[list,list,list] >>> app [[], [], []] >>> ...
- 【需求设计1】VIP积分系统无聊YY
RT,想到什么就写什么呗,这是最简单的方式,顺便给自己做一个记录,反正自己记忆力也不太好.本文是仿陆金所的积分系统,自己YY的一套东西. 首先我想做一个VIP兑换投资卷的功能: 我们先来确定一些我知道 ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- ReactiveCocoa代码实践之-UI组件的RAC信号操作
上一节是自己对网络层的一些重构,本节是自己一些代码小实践做出的一些demo程序,基本涵盖大多数UI控件操作. 一.用UISlider实现调色板 假设我们现在做一个demo,上面有一个View用来展示颜 ...
- 二次剩余、三次剩余、k次剩余
今天研究了一下这块内容...首先是板子 #include <iostream> #include <stdio.h> #include <math.h> #incl ...