首先讲讲代理模式。什么是静态代理,为何须要动态代理?设计模式
定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
目的:1.经过引入代理对象来间接访问目标对象,防止直接访问目标对象给系统带来的没必要要复杂性;2.经过代理对象对原有的业务加强。ide
如图代理模式类图:测试
简单看了下图解就开始上代码吧
1.先定义一个抽象对象即公共接口类this
/** * 负责生产男性用品 */ public interface ManToolFactory { public void saleManTool(String size); }
2.真实对象spa
/** * A工厂负责生产男性用品 */ public class AManFactory implements ManToolFactory { @Override public void saleManTool(String size) { System.out.println("A工厂出售男性用品,大小为" + size ); } }
3.代理对象设计
/** * 静态代理类 */ public class StaticProxy implements ManToolFactory { // 代理的真实对象,多个的话考虑公用object也就是动态代理的实现 private ManToolFactory manFactory;// 相似搬运工,代理真实对象的方法 public StaticProxy(ManToolFactory manFactory) { this.manFactory= manFactory; } @Override public void saleManTool(String size) { dosomeThingBefore();//前置加强 manFactory.saleManTool(size); dosomeThingAfter();//后置加强 } public void dosomeThingBefore() { System.out.println("售前服务,负责产品的调研工做"); } public void dosomeThingAfter() { System.out.println("售后服务,送门服务,三包等"); } }
测试类:代理
public class StaticProxyTest { public static void main(String[] args) { // 真实对象:A工厂生产男性用品 ManToolFactory manToolFactory = new AManFactory(); // 代理对象:负责代购男性用品 StaticProxy staticProxy = new StaticProxy(manToolFactory); // 代理对象完成代购 staticProxy.saleManTool("100"); } }
/** * 负责生产女性用品的抽象对象 */ public interface WomanToolFactory { public void saleWomanTool(Double length); } /** * B工厂专门负责生产男性用品(真实对象) */ public class BWomanFactory implements WomanToolFactory { @Override public void saleWomanTool(Double length) { System.out.println("B工厂生产女性用品,长度" + length); } } 此时代理类须要修改,开始思路以下 public class StaticProxy implements ManToolFactory,WomanToolFactory { private ManToolFactory manFactory; private WomanToolFactory womanFactory; @Override public void saleManTool(String size) { //TODO } @Override public void saleWomanTool(Double length) { //TODO }
那若是再多一个业务,代购点别的产品,那是否是又要再实现一个接口,这样就违背了设计模式的原则:开闭原则,扩展能力差,可维护性差.
所以动态代理就出现了。动态代理请看下节code