责任链设计模式

211 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。(摘自百度百科)

情景模拟

不务正业的 小张(男一号)家里有四口人,小张 ,小张姐姐(女二号)小张的爸爸(男三号)小张的妈妈(女四号),小张家人们都是比较勤劳,都通过自己的工作拥有自己的个人资产,除了小张,小张的姐姐(资产20W)小张的爸爸(资产100w),小张妈妈(1000W),小张(资产0),但是家人们都很疼爱他,只要在自己能力范围内,都会给钱满足小张的愿望。这一天小张想买个 保时捷回家要钱了,但是小张要钱是有自己的顺序的,先给姐姐要,超出姐姐能力范围在给爸爸要,超出爸爸范围在给妈妈要。

具体代码实现

1.创建抽象处理类
public abstract class HandleEvent {
	
	private HandleEvent handleEvent;
	
	private float maxPrice=0.0f;
	
	public  HandleEvent(float maxPrice) {
		this.maxPrice=maxPrice;
	}
	
	public abstract void handleMoney(RquestItem item);

	
	public final void request(RquestItem item) {
		
		if (item.getMoney()<=maxPrice) {
			this.handleMoney(item);
		}else {
			
			if (this.getHandleEvent()!=null) {
				this.getHandleEvent().request(item);
			}else {
				System.out.println("这个家已经满足不了你了,需要你自己去努力挣钱了!!!!!");
			}
		}
	}
	
	public HandleEvent getHandleEvent() {
		return handleEvent;
	}


	public void setHandleEvent(HandleEvent handleEvent) {
		this.handleEvent = handleEvent;
	}
	
	

}

2.创建实现类
2.1 姐姐类
public class Sister extends HandleEvent{
	
	
	public  Sister(float maxPrice) {
		super(maxPrice);
	}
	
	public void handleMoney(RquestItem item) {
		
		System.out.println(item.getName()+"因为"+item.getReson()+"原因需要钱:"+item.getMoney());
		
		System.out.println("姐姐我同意了");
	}

}
2.2 爸爸类
public class Father extends HandleEvent {



    public  Father(float maxPrice) {

        super(maxPrice);

    }

    @Override

    public void handleMoney(RquestItem item) {

        // TODO 自动生成的方法存根

        

        System.out.println(item.getName()+"因为"+item.getReson()+"原因需要钱:"+item.getMoney());

        

        System.out.println("爸爸我同意了");

    }



}


2.3 妈妈类
public class Mother extends HandleEvent{

	
	public  Mother(float maxPrice) {
		super(maxPrice);
	}
	@Override
	public void handleMoney(RquestItem item) {
		// TODO 自动生成的方法存根
		System.out.println(item.getName()+"因为"+item.getReson()+"原因需要钱:"+item.getMoney());
		
		System.out.println("妈妈我同意了");
		
	}

}

3 创建一个愿望请求类
public class RquestItem {

	private String name;
	
	private String reson;
	
	private float money;
	
	

	public float getMoney() {
		return money;
	}

	public void setMoney(float money) {
		this.money = money;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getReson() {
		return reson;
	}

	public void setReson(String reson) {
		this.reson = reson;
	}
	
}

4 创建一个处理所有能处理愿望的管理类
public class HandleChain {
	
	private List<HandleEvent> list=new ArrayList<>();
	
	
	public HandleChain(List<HandleEvent> chainList) {
	
			for(int i = 0; i < chainList.size();i++){  
				HandleEvent current =chainList.get(i);  
			    if (i<chainList.size()-1) {
			    	current.setHandleEvent(chainList.get(i+1));
				}
			}

		this.list=chainList;
	}
	
	
	public void process(RquestItem item) {
		if (this.list.size()>0) {
			list.get(0).request(item);
		}
	}

}
5 小张类
public class Test {
	
	public static void main(String[] args) {
		
		
		RquestItem rquestItem=new RquestItem();
		rquestItem.setName("小张");
		rquestItem.setReson("我要买保时捷");
		rquestItem.setMoney(2000000);
		
		
		List<HandleEvent> list=new ArrayList<>();
		HandleEvent sister=new Sister(200000);
		HandleEvent father=new Father(1000000);
		HandleEvent mother=new Mother(10000000);
		HandleEvent fupo=new Fupo(2000000);
		list.add(sister);
		list.add(father);
		list.add(mother); 
		HandleChain handleChain=new HandleChain(list);
		handleChain.process(rquestItem);
		
	}

}

愿望得到反馈


小张因为我要买保时捷原因需要钱:2000000.0

妈妈我同意了