zoukankan      html  css  js  c++  java
  • 【设计模式】责任者模式

    责任链模式,是处理对象将请求沿着一条链,找到能处理此请求的对象。

    责任链模式的例子

    下面以数据从数据库取还是从缓存中取为例,代码描述责任链的样子。
    全部责任者的父类,继承者实现抽象方法。

    public abstract class Handler {
        
    	// 上一级的责任者
    	private Handler successor;
    	
    	public abstract String handle(Integer docId);
    	
    	/* 责任者的Getter、Setter */
    	public Handler getSuccessor() {
    		return successor;
    	}
    
    	public void setSuccessor(Handler successor) {
    		this.successor = successor;
    	}
    	
    }
    

    责任者之一:数据库。编号为1-9的文章由此责任者读取。

    import java.util.HashMap;
    import java.util.Map;
    
    
    
    public class DataBaseHandler extends Handler {
    
        @Override
    	public String handle(Integer docId) {
    		if (this.getSuccessor() != null) {
    			String result =  this.getSuccessor().handle(docId);
    			
    			if (result != null) {
    				return result;
    			}
    		}
    		
    		Map<Integer, String> map = new HashMap<Integer, String>();
    		for (int i = 1; i <= 9; i++) {
    			map.put(i, "文章" + i);
    		}
    		
    		System.out.println(this.getClass().getName() + " do business.");
    		return map.get(docId);
    	}
    
    }
    

    责任者之一:缓存。编号为1-3的文章由此责任者读取。

    import java.util.HashMap;
    import java.util.Map;
    
    
    
    public class CacheHandler extends Handler {
    
        @Override
    	public String handle(Integer docId) {
    		if (this.getSuccessor() != null) {
    			String result =  this.getSuccessor().handle(docId);
    			
    			if (result != null) {
    				return result;
    			}
    		}
    		
    		Map<Integer, String> map = new HashMap<Integer, String>();
    		for (int i = 1; i <= 3; i++) {
    			map.put(i, "文章" + i);
    		}
    		
    		System.out.println(this.getClass().getName() + " do business.");
    		
    		return map.get(docId);
    	}
    
    }
    

    设置他们的责任关系,调用责任者

    public class HowToUse {
    
        public static void main(String[] args) {
    		Handler dataBaseHandler = new DataBaseHandler();
    		Handler cacheHandler = new CacheHandler();
    		
    		dataBaseHandler.setSuccessor(cacheHandler);
    		
    		System.out.println(dataBaseHandler.handle(3));
    		System.out.println(dataBaseHandler.handle(5));
    	}
    
    }
    

    日志如下:

    CacheHandler do business.
    文章3
    CacheHandler do business.
    DataBaseHandler do business.
    文章5
    

    责任者的例子完毕。

    部分重构

    下面代码进行部分重构:判断环节进行封装公用,以及入参出参的泛型处理。

    
    public abstract class Handler<I, O> {
        
    	// 上一级的责任者
    	private Handler<I, O> successor;
    	
    	public abstract O handle(I i);
    	
    	public O handleFacade(I i) {
    		O o = null;
    		if (this.getSuccessor() != null) {
    			o = this.getSuccessor().handleFacade(i);
    			
    			if (o != null) {
    				return o;
    			}
    		}
    		
    		return this.handle(i);
    	}
    
    	/* 责任者的Getter、Setter */
    	public Handler<I, O> getSuccessor() {
    		return successor;
    	}
    
    	public void setSuccessor(Handler<I, O> successor) {
    		this.successor = successor;
    	}
    	
    }
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    public class DataBaseHandler extends Handler<Integer, String> {
    
        @Override
    	public String handle(Integer docId) {
    		Map<Integer, String> map = new HashMap<Integer, String>();
    		for (int i = 1; i <= 9; i++) {
    			map.put(i, "文章" + i);
    		}
    		
    		System.out.println(this.getClass().getName() + " do business.");
    		return map.get(docId);
    	}
    
    }
    

    其他类略。

  • 相关阅读:
    sgdisk基本用法
    影响性能的关键部分-ceph的osd journal写
    SSD固态盘应用于Ceph集群的四种典型使用场景
    Ceph在OpenStack中的地位
    Ceph的工作原理及流程
    Ceph系统的层次结构
    SharePoint运行状况分析器有关磁盘空间不足的警告
    Microsoft Exchange本地和Exchange Online可以与第三方服务共享
    SharePoint Server 2016 WEB 网站浏览器支持
    禁用自动映射的 Exchange 邮箱
  • 原文地址:https://www.cnblogs.com/nick-huang/p/6274462.html
Copyright © 2011-2022 走看看