zoukankan      html  css  js  c++  java
  • 设计模式-代理模式

    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
    在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
    如何解决:增加中间层。

    静态代理
    public class OrderServiceStaticProxy {
        private IOrderService iOrderService;
    
        public int saveOrder(Order order){
            beforeMethod(order);
            iOrderService = new OrderServiceImpl();
            int result = iOrderService.saveOrder(order);
            afterMethod();
            return result;
        }
    
        private void beforeMethod(Order order){
            int userId = order.getUserId();
            int dbRouter = userId % 2;
            System.out.println("静态代理分配到【db"+dbRouter+"】处理数据");
    
            //todo 设置dataSource;
            DataSourceContextHolder.setDBType("db"+String.valueOf(dbRouter));
            System.out.println("静态代理 before code");
        }
        private void afterMethod(){
            System.out.println("静态代理 after code");
        }
    }

    动态代理

    public class OrderServiceDynamicProxy implements InvocationHandler {
    
        private Object target;
    
        public OrderServiceDynamicProxy(Object target) {
            this.target = target;
        }
    
        public Object bind(){
            Class cls = target.getClass();
            return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),this);
        }
    
    
    
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object argObject = args[0];
            beforeMethod(argObject);
            Object object = method.invoke(target,args);
            afterMethod();
            return object;
        }
    
        private void beforeMethod(Object obj){
            int userId = 0;
            System.out.println("动态代理 before code");
            if(obj instanceof Order){
                Order order = (Order)obj;
                userId = order.getUserId();
            }
            int dbRouter = userId % 2;
            System.out.println("动态代理分配到【db"+dbRouter+"】处理数据");
    
            //todo 设置dataSource;
            DataSourceContextHolder.setDBType("db"+String.valueOf(dbRouter));
        }
    
        private void afterMethod(){
            System.out.println("动态代理 after code");
        }
    }
  • 相关阅读:
    深入了解css的行高Line Height属性
    【C++】函数指针
    【C++】常用知识点
    将数字转化为液晶显示屏的样子
    【多媒体】PCM
    【Android】网络下载图片&SD卡文件存储
    CPU 缓存(Cache)
    【C++】typename
    【多媒体】音频格式
    【Android】图片的异步加载
  • 原文地址:https://www.cnblogs.com/woodpecker-z/p/14658089.html
Copyright © 2011-2022 走看看