`

仿mina filter示例

    博客分类:
  • mina
阅读更多

关于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

1
0
分享到:
评论
1 楼 pywepe 2011-10-08  
和java ee filter最大的区别就是双向了

另外就是mina的filter方法特别多,有点像事件监听器

相关推荐

Global site tag (gtag.js) - Google Analytics