欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java经典设计模式之责任链模式原理与用法详解

程序员文章站 2024-02-19 08:10:52
本文实例讲述了java经典设计模式之责任链模式。分享给大家供大家参考,具体如下: 责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到链上的某一...

本文实例讲述了java经典设计模式之责任链模式。分享给大家供大家参考,具体如下:

责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到链上的某一个接收对象处理此请求。因为请求的客户端并不知道链上最终是谁来处理这个请求,使得系统可以在不影响客户端的情况下动态地重新组织和分配责任,从而避免了请求发送者与请求处理者之间的耦合。

责任链械中涉及到三种角色:

1,抽象处理者角色
2,具体处理者角色
3,请求发送者

小例子:假设去买房子,买房子就需要砍价, 卖房的人职位不同,可以优惠的价格也不同,不同职位就可以形成一个处理请求的链。我们暂定: * 基层销售员,只能优惠3% * 销售经理:可以优惠5% * 销售总监:可以优惠8% * 老板(boss):优惠10%

直接上代码:

/**
 * 抽象处理者(handler)角色:处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。
 * 这个角色通常由一个java抽象类或者java接口实现。抽象方法handlepricerequest()规范了子类处理请求的操作。
 * @date 2015-12-24 上午11:26:56
 */
public abstract class roomratehandler {
protected roomratehandler mhandler;
//直接由子类继承,用于传递请求
public void setpricehandler(roomratehandler mhandler){
this.mhandler=mhandler;
}
//处理具体问题:处理价格请求
public abstract void handlepricerequest(float discount);
/**
* 设置请求处理链的层次关系 ,获取处理请求的对象
* @description:
* @date 2015-12-24 上午11:51:54
*/
public static roomratehandler cretatehandler(){
roomratehandler salesman=new salesman();
roomratehandler salesmanager=new salesmanager();
roomratehandler saledirector=new salesdirector();
roomratehandler topmanager=new topmanager();
salesman.setpricehandler(salesmanager);
salesmanager.setpricehandler(saledirector);
saledirector.setpricehandler(topmanager);
return salesman;
}
} 

具体处理者(salesman)角色

/**
 * 具体处理者(salesman)角色:具体处理者(salesdirector)角色:具体处理者收到请求后,可以选择处理请求,也可以将请求传给下家(上级)。
 * 具体处理者都持有对链上下家(上级)对象的引用,因此具体处理者把请求传递下去。
 * @description:
 * @date 2015-12-24 上午11:29:16
 */
public class salesman extends roomratehandler {
@override
public void handlepricerequest(float discount) {
if(discount<=0.03){
system.out.format("%s批准了:%.3f%n","业务员",discount);
}else{
mhandler.handlepricerequest(discount);
}
}
}

具体处理者(salesmanager)角色

public class salesmanager extends roomratehandler {
@override
public void handlepricerequest(float discount) {
if(discount<=0.08){
system.out.format("%s批准了:%.3f%n","销售经理",discount);
}else{
mhandler.handlepricerequest(discount);
}
}
}

具体处理者(salesdirector )角色

public class salesdirector extends roomratehandler {
@override
public void handlepricerequest(float discount) {
if(discount<=0.05){
system.out.format("%s批准了:%.3f%n","销售总监",discount);
}else{
mhandler.handlepricerequest(discount);
}
}
}

具体处理者(topmanager)角色

/**
 * 具体处理者(topmanager)角色:因为当前 角色已经处于链尾,所以是最终处理了。
 * @description:
 * @author ldm
 * @date 2015-12-24 上午11:29:16
 */
public class topmanager extends roomratehandler {
@override
public void handlepricerequest(float discount) {
if (discount <= 0.1) {
system.out.format("%s批准了:%.3f%n", "老板", discount);
}
else {
system.out.format("%s不同意:%.3f%n", "老板", discount);
}
}
}

请求发送者

/**
 * 发出请求的客户(模拟买房子的人)
 * @description:
 * @author ldm
 * @date 2015-12-24 上午11:35:54
 */
public class customer {
private roomratehandler mhandler;
public void setpricehandler(roomratehandler mhandler) {
this.mhandler = mhandler;
}
public void requestdiscount(float discount) {
mhandler.handlepricerequest(discount);
}
public static void main(string[] args) {
customer customer = new customer();
customer.setpricehandler(roomratehandler.cretatehandler());//获取处理对象,站你面前的可能是老板,也可能是业务员...
random random = new random();
for (int i = 0; i < 8; i++) {// 随机构造8个买房子的人
system.out.println(i + "---");
customer.requestdiscount(random.nextfloat()/10);//处理价格(谈判)
}
}
}

处理结果

Java经典设计模式之责任链模式原理与用法详解

如果要增加层级怎么办呢?很简单,比如增加销售主管salessupervisor,我们只需要新建一个类salessupervisor extends roomratehandler,实现处理方法handlepricerequest(float discount);同时不要忘记在roomratehandler类中cretatehandler()中设置好对应的层级链就可以啦。

更多java相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。