仿mina filter示例

本文介绍Mina框架中责任链模式(COR)的具体实现方式,通过定义Filter接口及FilterChain接口,创建双向链表结构处理消息。示例代码展示了如何通过添加过滤器处理请求并最终执行业务逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于filter,基本上都是通过cor模式来实例的,著名的servlet filter。

对于cor模式,Chain of Responsibility 模式    cor改进 说得很清楚了。

现在根据mina的filter实现,写小个示例,演示下mina的cor实现。其实mina的filter更加像是个双向链表。基于常见 的cor模式是有点诡异了[mina指南]诡 异的 IoFilterChain实现

 

所有代码都是基于接口编程。

Filter接口

package minacor;

public interface Filter {
	void messageReceived(NextFilter nextFilter,Object message);

	public interface NextFilter {
		void messageReceived(Object message);
	}
}

FilterChain接口,这只有一个简单方法,mina中还有更多方法

package minacor;

public interface FilterChain {
	/**
	 * 在filter chain尾部加个filter
	 * @param filter
	 */
	void addLast(Filter filter);
}

Request接口

package minacor;

/**
 * 请求类
 * Request.java 2010-3-1 下午09:41:42
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public interface Request {
	/**
	 * 请求真正业务执行
	 * @param message
	 */
	public void execute(Object message);
	/**
	 * 得到请求数据
	 * @return
	 */
	public Object getMessage();
}

FilterChain的默认实现

package minacor;

import minacor.Filter.NextFilter;
/**
 * 
 * DefaultFilterChain.java 2010-3-1 下午09:46:03
 * @Description:FilterChain默认实现
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class DefaultFilterChain implements FilterChain {
	//chain上的第一个实体,相当于链表的第一个节点
	private Entry head;
	//chain上的最后一个实体,相当于链表最后一个节点
	private Entry tail;

	private Request request;

	public Request getRequest() {
		return request;
	}

	public void setRequest(Request request) {
		this.request = request;
	}

	public DefaultFilterChain() {
		this.head = new Entry(null, null, new HeadFilter());
		this.tail = new Entry(head, null, new TailFilter());
		head.nextEntry = tail;
	}

	@Override
	public void addLast(Filter filter) {
		register(tail.prevEntry, filter);
	}

	private void register(Entry prevEntry, Filter filter) {
		Entry newEntry = new Entry(prevEntry, prevEntry.nextEntry, filter);
		prevEntry.nextEntry.prevEntry = newEntry;
		prevEntry.nextEntry = newEntry;
	}
	
	/**
	 * 
	 *实体类,相当于链表上的节点,节点中包括了上一个节点与下一个节点
	 *以及真实数据,也就是Filter
	 */
	private class Entry {

		private Entry prevEntry;
		private Entry nextEntry;
		private Filter filter;
		private final NextFilter nextFilter;

		public Entry(Entry prevEntry, Entry nextEntry, Filter filter) {
			this.prevEntry = prevEntry;
			this.nextEntry = nextEntry;
			this.filter = filter;

			this.nextFilter = new NextFilter() {

				@Override
				public void messageReceived(Object message) {
					Entry nextEntry = Entry.this.nextEntry;
					callNextMessageReceived(nextEntry, message);

				}

			};
		}

		public Entry getPrevEntry() {
			return prevEntry;
		}

		public void setPrevEntry(Entry prevEntry) {
			this.prevEntry = prevEntry;
		}

		public Entry getNextEntry() {
			return nextEntry;
		}

		public void setNextEntry(Entry nextEntry) {
			this.nextEntry = nextEntry;
		}

		public Filter getFilter() {
			return filter;
		}

		public void setFilter(Filter filter) {
			this.filter = filter;
		}

		public NextFilter getNextFilter() {
			return nextFilter;
		}

	}

	public void fireMessageReceived(Object message) {
		Entry head = this.head;

		callNextMessageReceived(head, message);
	}

	private void callNextMessageReceived(Entry entry, Object message) {
		System.out.println("call next");
		Filter filter = entry.getFilter();

		NextFilter nextFilter = entry.getNextFilter();

		filter.messageReceived(nextFilter, message);

	}

	private class HeadFilter implements Filter {

		@Override
		public void messageReceived(NextFilter nextFilter, Object message) {
			nextFilter.messageReceived(message);
		}

	}

	private class TailFilter implements Filter {

		@Override
		public void messageReceived(NextFilter nextFilter, Object message) {
			request.execute(message);
		}

	}

}

 

package minacor;
/**
 * Filter的一个简单实现
 * DemoFilter.java 2010-3-1 下午09:50:47
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class DemoFilter implements Filter{

	@Override
	public void messageReceived(NextFilter nextFilter,Object message) {
		message = message.toString()+" demofilter ";
		nextFilter.messageReceived(message);
	}

}

 

package minacor;
/**
 * Request的一个简单实现
 * PrintRequest.java 2010-3-1 下午09:53:50
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class PrintRequest implements Request {
	private Object message;

	public Object getMessage() {
		return message;
	}

	public void setMessage(Object message) {
		this.message = message;
	}

	public PrintRequest(Object message) {
		this.message = message;
	}

	@Override
	public void execute(Object message) {
		System.out.println(" print request " + message.toString());
	}

}
package minacor;

/**
 * 服务器端,管理FilterChain,Request
 * Server.java 2010-3-1 下午09:55:19
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class Server {
	
	private DefaultFilterChain filterChain = new DefaultFilterChain();

	public FilterChain getFilterChain(){
		return filterChain;
	}
	
	/**
	 * 处理请求
	 * @param request
	 */
	public void handleRequest(Request request){
		filterChain.setRequest(request);
		filterChain.fireMessageReceived(request.getMessage());
	}
	

}
package minacor;
/**
 * 客户端
 * Client.java 2010-3-1 下午09:56:48
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class Client {
	
	public static void main(String[] args) {
		Server server = new Server();
		server.getFilterChain().addLast(new DemoFilter());
		server.handleRequest(new PrintRequest("ffff"));
	}
}

 

http://www.java1995.cn/blog/item/123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值