View on GitHub

severalfly 个人博客

severalfly 个人博客,一起分享知识

Download this project as a .zip file Download this project as a tar.gz file

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

从定义看,与状态模式很相近,这个也需要抽时间找下区别

来个例子

首先定义处理基类


public abstract class Handler
{
	protected Handler successor;
	// setter && getter
	public abstract void handleRequest(int request);

}

具体类1,处理0~10

public class ConcreteHandler1 extends Handler
{
	@Override
	public void handleRequest(int request)
	{
		if (request > 0 && request < 10)
		{
			System.out.println("handler1处理请求" + request);
		}
		else if (this.successor != null)
		{
			this.successor.handleRequest(request);
		}
	}
}

具体类2,处理10~20

public class ConcreteHandler2 extends Handler
{
	@Override
	public void handleRequest(int request)
	{
		if (request >= 10 && request < 20)
		{
			System.out.println("handler2处理请求" + request);
		}
		else if (this.successor != null)
		{
			this.successor.handleRequest(request);
		}
	}
}

具体类3,处理20~

public class ConcreteHandler3 extends Handler
{
	@Override
	public void handleRequest(int request)
	{
		if(request >=20)
		{
			System.out.println("handler3开始处理了" + request);
		}
	}
}

客户端调用时,需要指定当前类的上级,即处理不了时,调用何方法处理

public class ChainMain
{
	public static void main(String[] args)
	{
		Handler h1 = new ConcreteHandler1();
		Handler h2 = new ConcreteHandler2();
		Handler h3 = new ConcreteHandler3();
		h1.setSuccessor(h2);
		h2.setSuccessor(h3);

		List<Integer> list = new ArrayList<Integer>();
		list.add(2);
		list.add(5);
		list.add(14);
		list.add(22);
		list.add(18);
		list.add(3);
		list.add(27);
		list.add(20);
		for (Integer i : list)
		{
			h1.handleRequest(i);
		}

	}
}

与状态模式很相近,貌似还没理解这两种模式的区别,回头一定要找下这个区别