zoukankan      html  css  js  c++  java
  • Shiro Filter中利用Callable和Runnable的委派模式

    Callable模式

    package com.wjz.core;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.Callable;
    
    public class SubjectCallable<V> implements Callable<V> {
        
        private Callable<V> delegate;
        
        private List<V> resouces;
        
        public SubjectCallable(Callable<V> delegate) {
            this.delegate = delegate;
        }
        
        @Override
        public V call() throws Exception {
            preCall();
            V v = doCall(this.delegate);
            postCall(v);
            return v;
        }
    
        private void add(V v) {
            resouces.add(v);
        }
    
        private void postCall(V v) {
            if (v == null) {
                throw new RuntimeException();
            }
            add(v);
        }
    
        private void preCall() {
            if (resouces == null) {
                resouces = new ArrayList<V>();
            }
        }
    
        private V doCall(Callable<V> target) throws Exception {
            return target.call();
        }
    
    }

    Runnable模式

    package com.wjz.core;
    
    public class SubjectRunnable<V> implements Runnable {
        
        private Runnable delegate;
    
        @Override
        public void run() {
            doRun(this.delegate);
        }
    
        private void doRun(Runnable target) {
            target.run();
        }
    
    }

    Demo

    package com.wjz.core;
    
    import java.util.concurrent.Callable;
    
    public class DelegatingSubject {
    
        public <V> V execute(Callable<V> delegate) {
            Callable<V> associated = associateWith(delegate);
            try {
                return associated.call();
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
    
        private <V> Callable<V> associateWith(Callable<V> delegate) {
            return new SubjectCallable<>(delegate);
        }
    }
  • 相关阅读:
    python语言程序设计部分习题
    Python基础:Python运行的两种基本方式
    python简介及详细安装方法
    MTBF平均故障间隔时间(转)
    SSH远程登录配置文件sshd_config详解
    SSH服务详解(转)
    GCC编译之后的代码信息
    移动设备识别ID
    STM32CubeMX自建MDK工程的基本步骤
    职位英文缩写
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/9377582.html
Copyright © 2011-2022 走看看