一、代理模式的应用场景
生活中的中介,黄牛,等一系列帮助甲方做事的行为,都是代理模式的体现。代理模式(Proxy Pattern)是指为题对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,代理模式属于结构型设计模式。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。客户端调用代理对象的方法,同时也调用被代理对象的方法,但是会在代理对象前后增加一些处理代码,在代码中,一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑。代理模式属于结构型模式,分为静态代理和动态代理。
二、静态代理
来看一个实际业务场景:在分布式业务场景中,通常会对数据库进行分库分表,可能需要配置多个数据源,通常会设置数据源路由来动态切换数据源。下面是实现过程:
/** * 订单类 */ @Data public class Order { private Object orderInfo; private Long createTime; private String id; }
/** * 持久层 */ @Compoment public class OrderDao { public int insert(Order order) { System.out.println("OrderDao 创建 Order 成功!"); return 1; } }
public interface IOrderService { int createOrder(Order order); }
@Service public class OrderService implements IOrderService { private OrderDao orderDao; @Override public int createOrder(Order order) { return 0; } }
接下来使用静态代理,主要完成功能:根据订单创建时间自动按年进行分库。根据开闭原则,我们修改原来写好的代码逻辑,通过代理对象完成。先创建数据源路由对象,使用ThredLocal的单利实现DynamicDataSoureEntry类:
/** * 动态切换数据源