高度抽象代码方法总结

点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源!

上一篇:Alibaba开源内网高并发编程手册.pdf

  • 通过抽象方法给子类实现,从而达到高度抽象的目的,这里针对不同类而言

  • 通过传递匿名内部类的形式将需要执行的内容传递给公共抽象类对应方法,这里适合类里面有多个方法需要抽象

  • future模式,异步执行,结果处理抽象, 具体实现各个子类实现

  • 反射,动态代理抽象

通过抽象方法给子类实现,从而达到高度抽象的目的,这里针对不同类而言

public class Test {
    public static void main(String[] args) {
        TestService testService = new TestService();
        testService.getResp(new Object());
    }

    private static class TestService extends BaseService {
        public Object getResp(Object req) {
            return service(req);
        }

        @Override
        protected void validateRequest(Object o) {
            System.out.println("来自TestService的验证");
        }
    }
}

public abstract class BaseService<Request, Response> {

    /**
     * 总体是通过抽象方法给子类实现,从而达到高度抽象的目的
     */
    public final Response service(Request request) {
        System.out.println("调用公共的service");
        // 各个子类实现
        validateRequest(request);
        // 各个子类实现,具体业务逻辑, 此处省略getBiz获取各个子类实际业务逻辑类
        /*Response response = getBiz().biz(request);*/
        System.out.println("结束调用公共的service");
        // 只是展示
        return null;
    }

    protected abstract void validateRequest(Request request);

    /*protected abstract Biz<Request, Response> getBiz();*/
}
  • 输出

调用公共的service
来自TestService的验证
结束调用公共的service

通过传递匿名内部类的形式将需要执行的内容传递给公共抽象类对应方法,这里适合类里面有多个方法需要抽象

public class Provider extends AbstractProvider {

    // 获取请求
    public void get(final String key) {
        executeCommand(key, () -> System.out.println("执行了获取指令, key:" + key), null);
    }

    // 判断是否存在
    public void exists(final String key) {
        executeCommand(key, () -> System.out.println("执行了判断是否存在指令, key:" + key), null);
    }

    public static void main(String[] args) {
        Provider provider = new Provider();
        provider.get("ss");
        provider.exists("sss");
    }
}

public abstract class AbstractProvider {

    protected <T> void executeCommand(String key, Command<T> command, T defaultValue) {
        command.execute();
    }
}

public interface Command<T> {
    void execute();
}

future模式,异步执行,结果处理抽象, 具体实现各个子类实现

  • 先看下异步响应之后的调用时序图

    2ad5d91936ad9449bc76aa94236e83f2.jpeg
    image
  • 这里在发送完请求之后,还会调用再次调用RequestFuture的compose方法,为RequestFuture增加listener,这里的listener作用是调用各个ResponHandleAdapter实现类,也就是各个请求的实现类。这样就把解析响应交回各个子类。时序图为: 1.1.1是future模式,1.1.2是为ReuqestFuture添加listener以便回调各个子类实现的onSuccess

    829466a7436f7ff6d240d2961d24af30.jpeg
    image
  • 具体看代码

public class SendJoinGroupRequest extends AbstractRequestSend implements ResponseHandleAdapter {
    public void sendJoinGroupRequest(String s){
        send(s).compose(this);
    }

    @Override
    public void onSuccess(String s) {
        System.out.println("SendJoinGroupRequest执行结果: " + s);
    }

    public static void main(String[] args) {
        SendJoinGroupRequest sendJoinGroupRequest = new SendJoinGroupRequest();
        sendJoinGroupRequest.sendJoinGroupRequest("测试发送JoinGroup检测请求");
        // 写SendHeartbeatRequest 类似的
       /* SendHeartbeatRequest sendHeartbeatRequest = new SendHeartbeatRequest();
        sendHeartbeatRequest.sendHeartbeat("测试发送心跳检测请求");*/
    }
}

public abstract class AbstractRequestSend {

    /**
     * 模拟异步执行任务
     */
    ExecutorService executorService = Executors.newSingleThreadExecutor();

    public RequestFuture send(String s) {
        // 这里是Future模式
        RequestFuture requestFuture = new RequestFuture();
        executorService.execute(new AsyncExeRemoteInvoke(requestFuture, s));
        return requestFuture;
    }

    private static class AsyncExeRemoteInvoke implements Runnable {
        private RequestFuture requestFuture;
        private String s;

        public AsyncExeRemoteInvoke(RequestFuture requestFuture, String s) {
            this.requestFuture = requestFuture;
            this.s = s;
        }

        @Override
        public void run() {
            // 模拟远程调用耗时
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String res = s + "远程调用结束";
            requestFuture.onComplete(res);
        }
    }
}

public interface ResponseHandleAdapter {
    void onSuccess(String s);
}

public class RequestFuture {
    private List<RequestFutureListener> requestFutureListenerList;

    public RequestFuture() {
        this.requestFutureListenerList = new ArrayList<>();
    }

    public void onComplete(String s){
        // 假设只执行成功的方法
        fireSuccess(s);
    }

    private void fireSuccess(String s) {
        // 假设只执行成功的方法
        requestFutureListenerList.forEach(requestFutureListener -> requestFutureListener.onSuccess(s));
    }

    private void addListener(RequestFutureListener requestFutureListener){
        requestFutureListenerList.add(requestFutureListener);
    }

    /**
     * 相当于给RequestFuture addListener
     */
    public void compose(ResponseHandleAdapter responseHandleAdapter){
        addListener(new RequestFutureListener() {
            @Override
            public void onSuccess(String s) {
                // 交回给各个请求处理类处理
                responseHandleAdapter.onSuccess(s);
            }

            @Override
            public void onFail() {
                // 暂时不处理
            }
        });
    }

}

public interface RequestFutureListener {
     void onSuccess(String s);

     void onFail();
}
  • 如果需要实现链式调用,即调用了各个ResponseHandleAdapter 处理结果之后,还需要继续回调,那么可以修改

  1. RequestFuture的compose方法为

public RequestFuture compose(ResponseHandleAdapter responseHandleAdapter){
    // 这里实现将结果传播出去的关键代码,执行完各个responseHandleAdapter后,
    // 链式的执行调用compose方法,调用compose方法会添加一个listener
    final RequestFuture future = new RequestFuture();
    addListener(new RequestFutureListener() {
        @Override
        public void onSuccess(String s) {
            // 交回给各个请求处理类处理
            responseHandleAdapter.onSuccess(s, future);
        }

        @Override
        public void onFail() {
            // 暂时不处理
        }
    });
    return future;
}
  1. 修改ResponseHandleAdapter

public interface ResponseHandleAdapter {
    void onSuccess(String s, RequestFuture future);
}
  1. 修改SendJoinGroupRequest

public class SendJoinGroupRequest extends AbstractRequestSend implements ResponseHandleAdapter {
    public RequestFuture sendJoinGroupRequest(String s){
        return send(s).compose(this);
    }

    @Override
    public void onSuccess(String s, RequestFuture future) {
        System.out.println("SendJoinGroupRequest执行结果: " + s);
        //将结果传播出去
        future.onComplete(s);
    }

    public static void main(String[] args) {
        SendJoinGroupRequest sendJoinGroupRequest = new SendJoinGroupRequest();
        RequestFuture future = sendJoinGroupRequest.sendJoinGroupRequest("测试发送JoinGroup检测请求");
        future.addListener(new RequestFutureListener() {
            @Override
            public void onSuccess(String s) {
                System.out.println("我是SendJoinGroupRequest传播出来的,请求为:" + s);

            }

            @Override
            public void onFail() {

            }
        });

       /* SendHeartbeatRequest sendHeartbeatRequest = new SendHeartbeatRequest();
        RequestFuture future1 = sendHeartbeatRequest.sendHeartbeat("测试发送心跳检测请求");
        future1.addListener(new RequestFutureListener() {
            @Override
            public void onSuccess(String s) {
                System.out.println("我是SendHeartbeatRequest传播出来的,请求为:" + s);
            }

            @Override
            public void onFail() {

            }
        });*/
    }
}
  1. 修改执行执行结果为

SendJoinGroupRequest执行结果: 测试发送JoinGroup检测请求远程调用结束
我是SendJoinGroupRequest传播出来的,请求为:测试发送JoinGroup检测请求远程调用结束

作者:后来丶_a24d
链接:https://www.jianshu.com/p/fadd3cf4ecf7

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.转行码农失败,找不到工作了!!

2.从零开始搭建创业公司后台技术栈

3.程序员一般可以从什么平台接私活?

4.Spring Boot+Redis+拦截器+自定义Annotation实现接口自动幂等

5.为什么国内 996 干不过国外的 955呢?

6.中国的铁路订票系统在世界上属于什么水平?                        

7.15张图看懂瞎忙和高效的区别!

13df22837a2c6929bf400994aa42d449.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值