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);
        }
    }
  • 相关阅读:
    按指定上下限区间进行数据统计的示例.sql
    树形数据层次显示处理示例.sql
    Flexi传授如何说服自己的老板采用Node.js
    sed的用法[转]
    [bash] string operators
    [shell script]脚本实现目录和文件名显示
    Bash快捷键
    [bash] Condition Tests
    整理一下博客
    老爸的工具箱之:根据日期批量重命名照片
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/9377582.html
Copyright © 2011-2022 走看看