大话设计模式:静态代理模式
代理模式分为静态代理和动态代理,本篇先介绍一下静态代理。将“静态代理”拆成“静态”和“代理”,什么是代理?其实我们生活中处处都存在代理。
事例一:比如去超市买东西,超市其实就是一个代理点,因此超市还叫代售点,因为超市本身不会生产东西,真正生产东西的是厂商,而我们消费者是不会直接去厂商买东西,而是通过超市这个中间层,间接买超市的东西。
事例二:律师,其实就是一个代理,就像我们平民大众,虽说知道法律,但不懂法律,遇到纠纷在法院打官司的时候,就需要请律师,律师的作用就是对平民的增强,他来代替我们打官司。
事例三:海外代购,像我们一般人,没机会或者没钱出国购物,怎么办?只能通过代购渠道来购买国外的产品,代购商会替我们在国外找到优质真品(当然你懂的)从国外买,然后寄回我们的手中,这就实现了我们自身的增强。
代理作为中间层,连通了我们和厂商之间,所以反映到Java中:
1. 代理类和厂商都需要实现同一个接口,目的是都具备了同一种功能。
2. 代理类还需要将厂商作为自己的属性,目的是为了让自己有从厂商那里购买东西的资格。
3. 通过创建代理类的对象来对目标方法的增强。
举例:
1. 创建共同的接口
/** * description * * @author 70KG * @date 2018/8/1 */ public interface IBusinessA { /** * Description: 卖包的业务接口 * Author:70KG * Param [brand] 品牌 * Return void * Date 2018/8/1 9:46 */ void saleBag(String brand); }
2. 创建厂商(需要实现业务接口)
/** * description * * @author 70KG * @date 2018/8/1 */ public class CompanyA implements IBusinessA { @Override public void saleBag(String brand) { System.out.println("从国外A公司买到一款" + brand + "牌的包。"); } }
3. 创建代理商(需要实现业务接口)
/** * description * * @author 70KG * @date 2018/8/1 */ public class ProxyClassBean implements IBusinessA { private CompanyA companyA; @Override public void saleBag(String brand) { // 购买前增强 doBefore(); // 通过国外公司代购产品 companyA.saleBag(brand); // 购买后增强 doAfter(); } public CompanyA getCompanyA() { return companyA; } public void setCompanyA(CompanyA companyA) { this.companyA = companyA; } // ===================代理类中的增强方法======================== public void doBefore() { System.out.println("在国外寻找优质的货源。"); } public void doAfter() { System.out.println("精包装安全邮寄回国内。"); } }
4. 通过创建代理类来实现对目标方法的增强
/** * description * * @author 70KG * @date 2018/8/1 */ public class MainTest { @Test public void test() { // 创建代理类的对象 ProxyClassBean proxyClassBean = new ProxyClassBean(); CompanyA companyA = new CompanyA(); proxyClassBean.setCompanyA(companyA); // 执行代理类的方法来对目标方法增强 proxyClassBean.saleBag("Gucci"); } }
5. 运行的结果
在国外寻找优质的货源。
从国外A公司买到一款Gucci牌的包。
精包装安全邮寄回国内。
静态代理的优点:能人所不能,会人所不会。对目标方法的增强。
静态代理的缺点:扩展性不好,假如业务扩展,需要实现的接口会很多,假如接口参数变动,所有的类都需要改变,扩展性很差。
改进:使用动态代理模式(dynamic proxy)