【java_设计模式】代理模式 静态代理

学习路径:https://coding.imooc.com/learn/list/270.html

  • 应用场景
    增强被代理对象的实现,具体增强的途径
    1. 增加前置方法:如过滤期望外的参数、选择数据库连接池、获取持久化的对象等。
    2. 增加后置方法:将被代理类的返回值封装、对返回值进行筛选等
  • 实现
public class OrderServiceStaticProxy {
    // 代理类持有被代理对象的引用,该对象是业务逻辑实现类
    private IOrderService iOrderService;

    public int saveOrder(Order order){
        beforeMethod(order);
        // 模拟spring注入一个系统服务
        iOrderService = new OrderServiceImpl();
        // 系统服务处理具体业务
        int result = iOrderService.saveOrder(order);
        afterMethod();
        return result;
    }

    /**
     * 根据不同的id选取不同的数据库连接
     * @param order
     */
    private void beforeMethod(Order order) {
        System.out.println("静态代理before code");
        // 模拟不同db的路由
        int 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");
    }
}


```java
	/**
     * 根据不同的id选取不同的数据库连接
     * @param order
     */
    private void beforeMethod(Order order) {
        System.out.println("静态代理before code");
        // 模拟不同db的路由
        int userId = order.getUserId();
        int dbRouter = userId % 2;
        System.out.println("静态代理分配到【db" + dbRouter +"】处理数据");
        // todo 设置dataSource;
        DataSourceContextHolder.setDBType("db" + String.valueOf(dbRouter));
    }
	public static void main(String[] args) {
        // 参数
        Order order = new Order();
        order.setUserId(1);
        // 创建代理, 不直接使用被代理对象
        OrderServiceStaticProxy orderServiceStaticProxy = new OrderServiceStaticProxy();
        // 使用代理的保存订单号操作
        orderServiceStaticProxy.saveOrder(order);
    }
  • 总结
    代理模式的静态代理实现,实质就是对被代理对象的入参和出参进行了一次封装,同时不破坏被代理对象的代码。应用层只用改一行代码即可。

你可能感兴趣的:(java,设计模式)