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

124 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情 

代理 定义与类型

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);
    }
}

//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();
    }
}

静态代理类

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 ");
    }

}

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);
    }
}

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