设计模式-利用职责链模式消除if
本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介。
本文主要内容:
- 需求(ShitCode)
- 职责链模式简介
- 设计理念
- 代码演示(消除if)
- 应用总结
一、需求(ShitCode)
package com.cnblogs.kmpp;
public class ShitCode {
public void doSomething(ParameterObject parameterObject)
{
if (parameterObject != null)//判断输入参数是否为null
{
if (parameterObject.getId() > 0)//判断输入参数的ID是否大于0
{
int code = getCodeById(parameterObject.getId());//业务逻辑判断
if (code > 0)
{
//有可能还会有其他的判断
//do something vaild
}
}
}
}
private int getCodeById(int id) {
return 0;
}
}
上面这段ShitCode很明显,有大量的if判断:在满足众多if后才去做具体的事情,上面ShitCode只有三个if,实际情况中有可能会更多。怎么办?
二、职责链模式简介
职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

上图是职责链模式的经典类图。如果了解这个设计模式,上面定义中说到的链路(successor)是由ConcreteHandler在HandleRequest的时候按照某种逻辑来指定的。比如请假,经理和总监是两个不同的ConcreteHandler,hr设定当请假天数大于5天时,需要总监来处理,这个时候经理会设置自己的successor为总监,从而形成一个链路。
三、设计理念
再次回到ShitCode。仔细看看ShitCode可以抽象为:当条件1满足的时候再去判断条件2。。。一直到条件N不满足或者最后一个条件满足为止(没有successor)。这是一个递归的过程。
所以这个条件之间的调度是可以抽象出来,本文开始说了,本次的应用是对职责链设计模式的应用,是一个变种。因为这个条件之间的调度是可以抽象出来,所以这个调度是可以放在父类中进行执行,而无需在每一个ConcreteHandle执行。这点便是对本文对于职责链设计模式的修改点。
四、代码演示(消除if)
4.1 父类:定义算法骨架
验证器的抽象,递归调度条件验证器。
package com.cnblogs.kmpp; public abstract class AbsctractValidator
{
private AbsctractValidator validatorSuccessor; protected void setValidatorSuccessor(AbsctractValidator validatorSuccessor)//这个和经典的职责链模式一样,用于设置下一个
{
this.validatorSuccessor = validatorSuccessor;
} public boolean validate(ParameterObject parameterObject)
{
boolean result=this.validateSelfLogic(parameterObject);//验证当前逻辑
if(result)//当前逻辑满足
{
if(this.validatorSuccessor!=null)//有下一个验证器
{
return this.validatorSuccessor.validate(parameterObject);//继续验证
}
}
return result;//返回最终结果
} public abstract boolean validateSelfLogic(ParameterObject parameterObject); }
4.2 第一个条件参数验证的ConcreteValidator
只需实现自己的参数验证逻辑,无需关注其他事情
package com.cnblogs.kmpp; public class ParameterValidator extends AbsctractValidator
{
@Override
public boolean validateSelfLogic(ParameterObject parameterObject)
{
System.out.println("in validator1");
if(parameterObject==null)
{
System.out.println("parameterObject is null");
return false;
}
if(parameterObject.getId()<=0)
{
System.out.println("parameterObject.getId()<=0");
return false;
}
return true;
}
}
4.3 第二个业务逻辑验证的ConcreteValidator
只需实现自己的业务逻辑验证逻辑,无需关注其他事情
package com.cnblogs.kmpp; public class BusinessLogicValidator extends AbsctractValidator
{
@Override
public boolean validateSelfLogic(ParameterObject parameterObject)
{
System.out.print("in validator2");
int code=this.getCodeById(parameterObject.getId());
if(code>0)
{
System.out.println("code>0");
return true;
}
return false;
} private int getCodeById(int id)
{
return 0;
}
}
当有新需求时候还可以继续扩展新的Validator。
4.4 Cient调用
package com.cnblogs.kmpp;
public class Client {
public static void main(String args[])
{
ParameterValidator parameterValidator=new ParameterValidator();
BusinessLogicValidator businessLogicValidator=new BusinessLogicValidator();
parameterValidator.setValidatorSuccessor(businessLogicValidator);
parameterValidator.validate(null);
}
}
上面的代码中已经消除成功消除了if。且上面的代码BusinessLogicValidator是不会执行的,因为validate(null)。第一个ParameterValidator最后会返回false。
五、总结
本文主要说职责链模式,其实仔细看看上面用到的也是模版方法:父类定义算法骨架,子类实现部分逻辑。
在本文的设计中,AbstractValidator完整的定义了算法骨架以及调度的抽象,每一个ConcreteValidator只需要实现真正属于自己验证的逻辑,无需关注其他事情,满足单一职责原则,那当然也满足了Open-Close原则:
- 每一个validator可以随便修改而不影响其他Validator
- 可以继续继承AbstractValidator实现新的Validator
设计模式要活学活用,不要过于拘泥于格式。上面的设计其实还可以衍生出很多变种的。
设计模式-利用职责链模式消除if的更多相关文章
- php设计模式之职责链模式
<?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这 ...
- 设计模式之职责链模式(JAVA实现)
学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...
- 深入理解JavaScript系列(38):设计模式之职责链模式
介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...
- 设计模式:职责链模式(Chain Of Responsibility)
定 义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- JavaScript设计模式_10_职责链模式
职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.职责链模式的名字非常形象,一系列可能 ...
- php实现设计模式之 职责链模式
<?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...
- JS常用的设计模式(15)—— 职责链模式
职责链模式是一个对象A向另一个对象B发起请求,如果B不处理,可以把请求转给C,如果C不处理,又可以把请求转给D.一直到有一个对象愿意处理这个请求为止. 打个比方,客户让老板写个php程序.老板肯定不写 ...
- 设计模式之职责链模式(Chain of Responsibility)
职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...
随机推荐
- O-Bomb(数位dp)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- 【HTML5开发系列】HTML元素总结
HTML元素汇总,包含HTML4元素和HTML5新增元素.Y表示有变化,N则表示没有变化,N/A表示未知 文档和元数据元素 包括说明HTML文档的结构,向浏览器说明文档的情况,定义脚本程序和css样式 ...
- 配置过滤器filter对跨站脚本攻击XSS实现拦截
1.web.xml中配置filter [html] view plain copy <filter> <filter-name></filter-name> & ...
- 类加载(一):static块 和 Class.forName
1. class Some { static{ System.out.println("1"); } public Some(){ System.out.println(" ...
- Lean In - 读书笔记
以下就是摘录了这本书中的相关内容. 他告诉我,想要“赢得每个人的喜欢”这种想法会阻碍我的发展.他说,当你想要让事情有所改变时,你不可能取悦每个人:而如果你去取悦每个人,你就不会获得充分的进步.扎克伯格 ...
- linux系统的nobody用户
正如window系统在安装完毕后会自动建立一些用户账号,linux也会生成一些目标是为了完成特定任务的账号,如nobody和ftp 首先,nobody是一个普通用户,没有特权,他存在的目的是为了让任何 ...
- Spring Cloud之Eureka环境搭建
pom: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o ...
- 算法(Algorithms)第4版 练习 2.2.11(1)
实现关键代码: private static void sort(Comparable[] input, int lo, int hi) { if((lo+CUTOFF-1) >= hi) { ...
- 投影矩阵、最小二乘法和SVD分解
投影矩阵广泛地应用在数学相关学科的各种证明中,但是由于其概念比较抽象,所以比较难理解.这篇文章主要从最小二乘法的推导导出投影矩阵,并且应用SVD分解,写出常用的几种投影矩阵的形式. 问题的提出 已知有 ...
- linux系统配置之单一网卡配置多个不同网段IP(centos)
1.用root权限的用户登录CENTOS,进入network-scripts文件夹下(本步骤可以省略,与二步骤一起完成): shell命令:cd /ect/sysconfig/network-scri ...