Java设计模式:代理模式

2020.08.01 08:08:30
2
阅读约2分钟

代理模式 #

生活中的租房中介,黄牛,婚介等,都是代理模式的实际体现,代理模式的定义也非常简单,是指为其他对象提供一种代理,以控制该对象的访问。代理对象在客户端和目标对象之间起到中介作用。
使用代理对象主要有两个目的:

  1. 保护目标对象
  2. 增强目标对象

静态代理 #

举个例子,有些人到了适婚年龄,其父母总是迫不及待的希望早点抱孙子,而现在各种压力之下,很多人都选择晚婚晚育,于是着急的服务就开始到处为自己的子女相亲,比子女自己还着急,这种相亲的过程就是一种代理。
顶层接口person的代码如下:

实际业务 #

创建订单类

public class Order {
    private Object orderInfo;
    private Long createTime;
    private String id;
  ## 省略getter和setter
}

持久层dao

class OrderDao{
    public int insert(Order order){
        System.out.println("创建成功");
        return 1;
    }
}

service接口

interface IOrderService{
    int createOrder(Order order);
}

实现类

class  OrderService implements IOrderService{
    private OrderDao orderDao;

    public OrderService() {
        this.orderDao = new OrderDao();
    }

    @Override
    public int createOrder(Order order) {
        return orderDao.insert(order);
    }
}

接下里使用静态代理,主要完成的功能是,根据订单创建时间自动按年进行分库。根据开闭原则,我们修改原来写好的代码逻辑,通过代理对象来完成。先创建数据源路由对象,使用ThreadLocal的单例实现DynamicDataSourceEntry:

class DynamicDataSourceEntry{
    // 默认数据源
    private final static String DEFAULT_SOURCE = null;
    private  final  static ThreadLocal<String> local = new ThreadLocal<>();

    private DynamicDataSourceEntry(){}

    // 清空数据源
    public static  void clear(){
        local.remove();
    }

    // 获取当前正在使用的数据源名字
    public static String get(){
        String s = local.get();
        return s;

    }

    // 还原当前切换的数据源
    public static void restore(){
        local.set(DEFAULT_SOURCE);
    }

    // 设置已知的数据源
     public  static  void set(String source){
        local.set(source);
     }

     // 根据年份动态设置数据源
    public static void set(int year){
        local.set("DB_"+year);
    }

}

创建切换数据源的代理类

class OrderServiceStaticProxy implements  IOrderService {
   private SimpleDateFormat sdf = new SimpleDateFormat("yyyy");

   private IOrderService iOrderService;

    public OrderServiceStaticProxy(IOrderService iOrderService) {
        this.iOrderService = iOrderService;
    }

    @Override
    public int createOrder(Order order) {
        before();
        Long createTime = order.getCreateTime();
        Integer dbRouter = Integer.valueOf(sdf.format(createTime));
        System.out.println("静态代理类自动分配到数据源DB_"+dbRouter);
        DynamicDataSourceEntry.set(dbRouter);
        iOrderService.createOrder(order);
        after();
        return 0;
    }

    private void after() {
        System.out.println("代理前");
    }

    private void before() {
        System.out.println("代理后");
    }
}

测试

class main{
    public static void main(String[] args) {
        try {
            Order order = new Order();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
            Date parse = simpleDateFormat.parse("2017/02/01");
            order.setCreateTime(parse.getTime());

            IOrderService orderServiceStaticProxy = new OrderServiceStaticProxy(new OrderService());
            orderServiceStaticProxy.createOrder(order);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

img 类图 img

阅读:2 . 字数:440 发布于 13 天前
本作品系 原创 , 采用 《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
推荐阅读
资源
  • 创意设计
  • 书栈网
  • 帮助中心
  • 声望与权限
  • 服务中心
  • 合作
  • 关于我
  • 广告投放
  • 职位发布
  • 联系我们
  • 关注
  • 技术日志
  • 运营日志
  • ❤ 608 天
  • 条款
  • 服务条款
  • 隐私政策
  • 下载 App
  • Copyright © 2018-2020 Siques