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机都有多个状态)并不知道动作细节,状态持有者只关心自己当前所处的状态 ...
随机推荐
- boosting、adaboost
1.boosting Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操作获 ...
- 移动web基本知识
1.pixel像素基础 1.px:csspixel 逻辑像素,浏览器所使用的抽象单位 2.dp,pt:设备无关像素 3.devicePixelPatio 设备像素缩放比例 2.viewport 1. ...
- CENTOS 6.5 平台离线编译安装 Mysql5.6.22
一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...
- Python的单元测试(二)
title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...
- 【初学python】使用python调用monkey测试
目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...
- 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。
前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...
- .NET Core的日志[5]:利用TraceSource写日志
从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...
- C++随笔:.NET CoreCLR之GC探索(3)
有几天没写GC相关的文章了哈,今天我讲GC的方式是通过一个小的Sample来讲解,这个小的示例代码只有全部Build成功了才会有.地址为D:\coreclr2\coreclr\bin\obj\Wind ...
- Twproject Gantt开源甘特图功能扩展
1.Twproject Gantt甘特图介绍 Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CS ...
- WinForm设置控件焦点focus
winform窗口打开后文本框的默认焦点设置,进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这个文本框里了. ②Winfor ...