状态模式与责任链模式
文章目录
- 一、状态模式
- 二、责任链模式
- 三、状态模式与责任链模式对比
一、状态模式
状态模式定义:当一个对象的内在状态改变时允许其改变行为,这个对象看起来像是改变了其类。也就是说类中的状态改变了,再调用类的方法得到的结果会有所不同
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,状态之间的转换在各个状态类中,可以把复杂的逻辑简化。
State抽象状态类:
public abstract class State{public abstract void handle(Context context);}
Context类,维护了一个State类型的对象,这个对象就是当前的状态:
public class Context{private State state;// 状态切换的参照private int hour;public Context(){// 状态初始化为ConcreteStateAthis.state = new ConcreteStateA();}public void setState(State state){this.state = state;System.out.println("当前状态:" + state.getClass().getClassName());}public State getState(){return this.state;} public void request(){state.handle(this);}
ConcreteState具体状态类:
public ConcreteStateA{@Overridepublic void handle(Context context){if(context.getHour() < 12){System.out.println("状态A");} else {// 切换到状态Bcontext.setState(new ConcreteStateB());context.request();}}}public ConcreteStateB{@Overridepublic void handle(Context context){if(context.getHour() >= 12){System.out.println("状态B");} else {// 切换到状态Acontext.setState(new ConcreteStateA());context.request();}}}
效果测试类:
public class Test{public static void main(String[] args) {Context context = new Context();context.setHour(19);context.request();context.setHour(9);context.request();}
}
输出:
状态B
状态A
二、责任链模式
责任链模式定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并将请求沿着这条链传递,直到有一个对象处理它为止。
Handler类,请求处理抽象类:
public abstract class Handler {/** 责任链中的下一个处理者 */protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}/** 处理请求的抽象方法 */public abstract void handle(int request);
}
ConcreteHandler,具体请求处理类
public class ConcreteHandlerA extends Handler{@Overridepublic void handle(int request) {if(request >= 0 && request < 10){System.out.println("ConcreteHandlerA处理请求 " + request);} else if(successor != null){// 不属于本处理器处理,将请求传递给下一个处理器处理successor.handle(request);}}
}public class ConcreteHandlerB extends Handler{@Overridepublic void handle(int request) {if(request >= 10 && request < 20){System.out.println("ConcreteHandlerB处理请求 " + request);} else if(successor != null){// 不属于本处理器处理,将请求传递给下一个处理器处理successor.handle(request);}}
}public class ConcreteHandlerC extends Handler{@Overridepublic void handle(int request) {if(request >= 20){System.out.println("ConcreteHandlerC处理请求 " + request);} else if(successor != null){// 不属于本处理器处理,将请求传递给下一个处理器处理successor.handle(request);}}
}
ResponsibilityLinkTest,效果演示测试类
public class ResponsibilityLinkTest {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();Handler handlerC = new ConcreteHandlerC();// 将请求处理对象形成链handlerA.setSuccessor(handlerB);handlerB.setSuccessor(handlerC);handlerA.handle(12);handlerA.handle(222);}
}
输出:
ConcreteHandlerB处理请求 12
ConcreteHandlerC处理请求 222
三、状态模式与责任链模式对比
状态模式与责任链模式都存在请求的传递处理,不同的是状态模式通过状态切换来使不同的状态处理类处理请求,而责任链模式直接传递给下一个请求处理类。
状态类中除明确自己在某个状态下的操作外,还要明确如何切换到其他状态
状态模式与责任链模式相关推荐
- 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别
状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...
- 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式
前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...
- 工厂模式、策略者模式、责任链模式综合应用
设计模式的具体运用: 简单工厂模式.策略者模式.责任链模式定义与使用 classLoader的具体运用 自定义的classloader 来动态加载类 程序功能设计: 在商城购物时,商城可能会在特殊的日 ...
- 行为型模式:责任链模式
定义:责任链模式(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处 ...
- Activiti 中的 命令模式与责任链模式
Activiti 中的 命令模式与责任链模式 类图: 标准命令模式: 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化. 主要解决:在软件系统中,行为请求者与行为实现者通常是一 ...
- 设计模式——行为型模式之责任链模式(简简单单入门责任链,理解I/O流消息怎么逐步传递处理以及服务器框架转发)
文章目录 前言 一.责任链模式定义 二.责任链模式结构 三.责任链高级应用 四.责任链模式优缺点 设计模式系列文章 结尾 前言 作者更有一系列设计模式文章(还在持续更新),图例丰富,少量代码,适合入门 ...
- 设计模式-责任型模式(责任链模式)
责任型模式是什么? 在责任链模式中很多对象都是由每一个对象对其下家的引用而联接起来形成一条责任链.请求在链上传递,直到链上的某一个对象决定处理次请求.发出这个请求的客户并不知道链上的哪一个对象最终处理 ...
- 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用
文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...
- 行为型模式之责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给与请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式 在 ...
最新文章
- verilog中wire和reg的区别,什么时候用wire?什么时候用reg?
- 英语写作学习笔录 task1 conclusion
- 怎么查看java的引用类_一段代码看 Java 引用类型
- 投放屏幕upnp协议探究抓包
- 手机UI界面模板psd源文件格式!
- 基于android的百度地图_百度的71个炸天的开源项目
- icmp协议_CCNA - Part7:网络层 - ICMP 应该是你最熟悉的协议了
- Django表单提交数据与网页跳转
- centos7.3 防火墙设置
- 《剑指offer》面试题31——连续子数组的最大和
- Git 远程仓库 git remote
- iframe是什么?iframe用法详解。
- 大数据查询语句SQL
- 学习嵌入式要学哪些课程?
- 联想小新13pro安装ubuntu双系统心得(解决无法识别启动U盘等问题)
- 见山只是山 见水只是水——提升对继承的认识
- Matlab似然比检验函数,似然比检验 LRT
- 使用Camtasia来给视频或者图片调色
- 【ZZ】从入门到高阶,你需要刷哪些书?丨高中物理竞赛辅导书推荐
- linux之vim下载及编写规则