静动态
1 角色分析: 2 3 - 抽象角色:一般会使用接口或者抽象类来解决 4 - 真实角色:被代理的角色 5 - 代理角色:代理真是角色,代理真实角色后,我们一般会做一些附属操作。 6 - 客户:访问代理对象的人! 7 ``` 8 //下面这个例子是静态 9 //接口 10 public interface UserService { 11 //添加 12 void add(); 13 //删除 14 void delete(); 15 //修改 16 void update(); 17 //查询 18 void query(); 19 }
1 //实现类 2 public class UserServiceImpl implements UserService { 3 @Override 4 public void add() { 5 System.out.println("增加一个学生"); 6 } 7 8 @Override 9 public void delete() { 10 System.out.println("删除一个学生"); 11 } 12 13 @Override 14 public void update() { 15 System.out.println("修改一个学生"); 16 17 } 18 19 @Override 20 public void query() { 21 System.out.println("查找一个学生"); 22 23 } 24 }
1 //增加一个类 2 public class UserServiceProxy implements UserService { 3 private UserService userService; 4 5 public void setUserService(UserService userService) { 6 this.userService = userService; 7 } 8 9 @Override 10 public void add() { 11 logger("增加"); 12 userService.add(); 13 } 14 15 @Override 16 public void delete() { 17 logger("删除"); 18 userService.delete(); 19 } 20 21 @Override 22 public void update() { 23 logger("修改"); 24 userService.update(); 25 } 26 27 @Override 28 public void query() { 29 logger("查询"); 30 userService.query(); 31 } 32 33 //日志 34 public void logger(String msg){ 35 System.out.println("使用"+msg); 36 } 37 }
1 //测试 2 public class Cilent { 3 public static void main(String[] args) { 4 UserServiceImpl userService = new UserServiceImpl() ; 5 UserServiceProxy u = new UserServiceProxy(); 6 u.setUserService(userService); 7 u.delete(); 8 } 9 }
上面这个是静态代理,下面这个使用动态实现
----------------------------------------------------------------------------------
下面这个例子是动态代理实现
1 //接口 2 public interface UserService { 3 //添加 4 void add(); 5 //删除 6 void delete(); 7 //修改 8 void update(); 9 //查询 10 void query(); 11 }
1 //实现类 2 public class UserServiceImpl implements UserService { 3 @Override 4 public void add() { 5 System.out.println("增加一个学生"); 6 } 7 8 @Override 9 public void delete() { 10 System.out.println("删除一个学生"); 11 } 12 13 @Override 14 public void update() { 15 System.out.println("修改一个学生"); 16 17 } 18 19 @Override 20 public void query() { 21 System.out.println("查找一个学生"); 22 23 } 24 }
1 //通过代理实现增加业务 2 public class ProxyInvocationHandler implements InvocationHandler { 3 private Object targer; 4 5 public void setTarger(Object targer){ 6 this.targer=targer; 7 } 8 9 public Object getProxy(){ 10 return Proxy.newProxyInstance(this.getClass().getClassLoader(), 11 targer.getClass().getInterfaces(), 12 this); 13 } 14 @Override 15 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 16 loogger(method.getName()); 17 Object result= method.invoke(targer, args); 18 19 return result; 20 } 21 public void loogger(String msg){ 22 System.out.println("你使用了"+msg+"方法"); 23 } 24 }
1 --测试类 2 3 4 public class Client { 5 public static void main(String[] args) { 6 //真实角色 7 UserServiceImpl userService = new UserServiceImpl(); 8 //代理角色 9 ProxyInvocationHandler pih = new ProxyInvocationHandler(); 10 //通过调用程序处理角色来出来我们要调用的接口对象 11 pih.setTarger(userService); 12 UserService proxy = (UserService) pih.getProxy(); 13 proxy.delete(); 14 } 15 }
代理模式的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
- 公共也就交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
缺点:
- 一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低