9 设计模式之职责链模式(九)

什么是职责链模式呢?

使多个对象都有机会处理请求,从而避免发送者和接收者之间的耦合关系。将这个对象连成一个链,并沿着这条链传递该请求,直到有一个对象处理它为止。

好处是它可以简化对象的相互链接,他们公需要保存一个指向其后继者的引用,而不需要保存所有的候选接受者的引用,降低了耦合程度。同时还可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。不过它也有不好的一面,那就是一个请求极有可能 到了链的末端都到不到处理,或者因为没有正确配置而得不到处理。

下面是该设计模式的逻辑代码:

1 抽象类或者基本类

1.1 Manager.java

package com.ops.responsibility;

public abstract class Manager {

	
	protected String name = null;
	protected Manager superior = null;
	
	public Manager(String name) {
		this.name = name;
	}
	
	
	public void setSuperior(Manager superior) {
		this.superior = superior;
	}
	
	
	abstract public void handleRequest(Request request);
}

1.2 Request.java

package com.ops.responsibility;

public class Request {

	private String content = null;
	private int number = -1;
	private String type = null;

	public Request() {

	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

}

2 实现类

2.1 CommonManager.java

package com.ops.responsibility.base;

import com.ops.responsibility.Manager;
import com.ops.responsibility.Request;


/**
 * 经理类
 * @author Administrator
 *
 */
public class CommonManager extends Manager {

	public CommonManager(String name) {
		super(name);
	}

	@Override
	public void handleRequest(Request request) {
		if ("LEAVE".equalsIgnoreCase(request.getType()) && 2 >= request.getNumber()) {
			System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 被批准");
		} else {
			if (null != superior) {
				superior.handleRequest(request);
			}
		}
	}

}

2.2 Majordomo.java

package com.ops.responsibility.base;

import com.ops.responsibility.Manager;
import com.ops.responsibility.Request;

/**
 * 总监
 * @author Administrator
 *
 */
public class Majordomo extends Manager {

	public Majordomo(String name) {
		super(name);
	}

	@Override
	public void handleRequest(Request request) {
		if ("LEAVE".equalsIgnoreCase(request.getType()) && 5 >= request.getNumber()) {
			System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 被批准");
		} else {
			if (null != superior) {
				superior.handleRequest(request);
			}
		}
	}

}

2.3 GeneralManager.java

package com.ops.responsibility.base;

import com.ops.responsibility.Manager;
import com.ops.responsibility.Request;


/**
 * 总经理
 * @author Administrator
 *
 */
public class GeneralManager extends Manager {

	public GeneralManager(String name) {
		super(name);
	}

	@Override
	public void handleRequest(Request request) {
		if ("LEAVE".equalsIgnoreCase(request.getType())) {
			if (5 >= request.getNumber()) {
				System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 被批准");
			} if (5 < request.getNumber()) {
				System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 小子,你不能请这么多天的喔!!!");
			}
			
		} else if ("SALARY_INCREASE".equalsIgnoreCase(request.getType())){
			if (500 >= request.getNumber()) {
				System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 被批准");
			} else if (500 < request.getNumber()) {
				System.out.println(name + ": " + request.getContent() + ", 数量: " + request.getNumber() + " 好好加油,以后再说吧!!!");
			}
		}
	}

}


3 客户端调用类

ResponsibilityClient.java

package com.ops.responsibility.main;

import org.junit.Test;

import com.ops.responsibility.Request;
import com.ops.responsibility.base.CommonManager;
import com.ops.responsibility.base.GeneralManager;
import com.ops.responsibility.base.Majordomo;

public class ResponsibilityClient {

	@Test
	public void test() {
		CommonManager jinli = new CommonManager("经理");
		Majordomo zongjian = new Majordomo("总监");
		GeneralManager zongjingli = new GeneralManager("总经理");
		
		jinli.setSuperior(zongjian);
		zongjian.setSuperior(zongjingli);
		
		Request request = new Request();
		request.setType("LEAVE");
		request.setContent("我要请假");
		request.setNumber(2);
		jinli.handleRequest(request);
		
		Request request2 = new Request();
		request2.setType("LEAVE");
		request2.setContent("我还是要请假");
		request2.setNumber(4);
		jinli.handleRequest(request2);
		
		
		Request request3 = new Request();
		request3.setType("SALARY_INCREASE");
		request3.setContent("我要钱多多");
		request3.setNumber(200);
		jinli.handleRequest(request3);
		 
		
		Request request4 = new Request();
		request4.setType("SALARY_INCREASE");
		request4.setContent("我要钱更多多");
		request4.setNumber(600);
		jinli.handleRequest(request4);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值