• 重学设计模式之代理模式一 静态代理


    代理 定义与类型

    1.定义

    为其他对象提供一种代理,以控制对这个对象的访问

    1.1 特点

    ​ 代理对象在客户端和目标对象之间起到中介的作用

    1.2 类型 : 结构型

    2.适用场景

    ​ 1、保护目标对象

    ​ 2、增强目标对象

    3.缺点

    1.代理模式会造成系统设计中类的数目增加

    2.在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢

    3.增加系统的复杂度

    4.优点

    ​ 1.代理模式能将代理对象与真实被调用的目标对象分离

    ​ 2.一定程度上降低了系统的耦合度,扩展性好

    ​ 3.保护目标对象

    ​ 4.增强目标对象

    5.代理-扩展

    静态代理

    动态代理

    CGLib 代理 继承 finaly 修饰符

    6.Spring 代理选择-扩展

    当Bean 有实现接口时 ,Spring 就会用JDK 的动态代理

    当Bean 没有实现接口时 Spring使用CGlib

    6.uml 设计图
    在这里插入图片描述

    8.代码如下

    package com.zw.design.pattern.creational.structural.proxy;
    
    import lombok.Data;
    
    @Data
    public class Order {
    
        private  Object orderInfo;
        private  Long   userId;
    
    }
    package com.zw.design.pattern.creational.structural.proxy;
    
    public interface IOrderDao {
        int  insert (Order order);
    }
    package com.zw.design.pattern.creational.structural.proxy;
    
    public  class IOrderDaoImpl  implements IOrderDao {
        @Override
        public int insert(Order order) {
            System.out.println("DAO 层添加order 成功");
            return 1;
        }
    }
    package com.zw.design.pattern.creational.structural.proxy;
    
    public interface IOrderService {
        int saveOrder(Order order);
    }
    
    package com.zw.design.pattern.creational.structural.proxy;
    
    public class IOrderServiceImpl implements  IOrderService{
    
        private IOrderDao IOrderDao;
    
        @Override
        public int saveOrder(Order order) {
            IOrderDao=new IOrderDaoImpl();
            System.out.println("order = service层调用dao层 " + order);
            return IOrderDao.insert(order);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    //spring分库思想
    package com.zw.design.pattern.creational.structural.proxy.db;
    
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
    
    public class DynamicDataSource extends AbstractRoutingDataSource {
        @Override
        protected Object determineCurrentLookupKey() {
            return DataSourceContextHolder.getDbType();
        }
    }
    
    package com.zw.design.pattern.creational.structural.proxy.db;
    
    public class DataSourceContextHolder {
    
        private static  final  ThreadLocal<String> CONTEXT_HOLDER=new ThreadLocal<String>();
    
    
        public static  void setDbType(String dbType){
            CONTEXT_HOLDER.set(dbType);
        }
        public static  String getDbType(){
            return CONTEXT_HOLDER.get();
        }
    
        public static void clearDBType(){
            CONTEXT_HOLDER.remove();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    静态代理类

    package com.zw.design.pattern.creational.structural.proxy.staticproxy;
    
    import com.zw.design.pattern.creational.structural.proxy.IOrderService;
    import com.zw.design.pattern.creational.structural.proxy.IOrderServiceImpl;
    import com.zw.design.pattern.creational.structural.proxy.Order;
    import com.zw.design.pattern.creational.structural.proxy.db.DataSourceContextHolder;
    
    /****
     * 静态代理
     */
    public class OrderServiceStaticProxy {
    
        private IOrderService iOrderService;
    
    
        public int saveOrder(Order order){
            beforeMethod();
            iOrderService=new IOrderServiceImpl();
            Long userId=order.getUserId();
            //开始业务操作
            int dbRouter= (int) (userId%2);
            System.out.println("dbRouter = 静态代理分配到 db" + dbRouter +"处理数据");
            //TODO 设置dataSource 这里有spring 分库的思想 ;
            DataSourceContextHolder.setDbType(String.valueOf(dbRouter));
            afterMethod();
            return  iOrderService.saveOrder(order);
        }
    
        private void beforeMethod(){
            System.out.println("静态代理 before  code");
        }
    
        private void afterMethod(){
            System.out.println("静态代理 after code ");
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    3.测试类

    package com.zw.design.pattern.creational.structural.proxy.staticproxy;
    
    import com.zw.design.pattern.creational.structural.proxy.Order;
    
    public class Test {
        public static void main(String[] args) {
            Order order=new Order();
            order.setUserId(2L);
            OrderServiceStaticProxy cs=new OrderServiceStaticProxy();
            int i = cs.saveOrder(order);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    测试结果如下
    在这里插入图片描述
    代码如下

  • 相关阅读:
    Java float和double精度范围大小(二进制存储角度剖析)
    Vue框架学习笔记——创建Vue实例、实例与容器对应关系
    springboot依赖的小知识点
    数据结构——哈希
    简单讲解RabbitMQ
    【设计模式深度剖析】【10】【行为型】【状态模式】
    AlmaLinux 文件拷贝 cp命令用法示例
    如何在银行系统中做批量测试~
    Python游戏篇:细节之大型游戏爆炸效果(附代码)
    辅导技巧-学习笔记
  • 原文地址:https://blog.csdn.net/qq_32048567/article/details/126149921