Java 代理模式

来源:互联网 发布:挂载linux是什么 编辑:程序博客网 时间:2024/05/15 20:15

转自:http://blog.csdn.net/guojun828/article/details/6155971



定义   为其它对象提供一种代理以控制对这个对象的访问

类图

[Java] view plain copy
  1. 通用代码  
  2. 抽象主题类  
  3. public interface Subject {  
  4. public void request();  
  5. }  
  6. 真实主题类  
  7. public class RealSubject implements Subject {  
  8. @Override  
  9.     public void request() {  
  10.         //具体业务处理  
  11.     }  
  12. }  
  13. 代理类  
  14. public class Proxy implements Subject {  
  15.     //要代理哪个实现类  
  16.     private Subject subject = null;  
  17.     //默认被代理者  
  18.     public Proxy(){  
  19.         this.subject = new Proxy();  
  20.     }  
  21.     //通过构造函数传递代理者  
  22.     public Proxy(Object...args){  
  23.     }  
  24.     //实现接口中定义的方法  
  25.     @Override  
  26.     public void request() {  
  27.         this.before();  
  28.         this.subject.request();  
  29.         this.after();  
  30.     }  
  31.     //预处理  
  32.     private void before(){  
  33.     }  
  34.     //善后处理  
  35.     private void after(){     
  36.     }  
  37. }  

优点

1.       职责清晰   真实的角色就是实现的业务逻辑,不用关心其他非本指责的事务

2.       高扩展性   具体主题角色不能怎么变化,只要它实现了接口,代理类完全可以在不做任何修改的情况下使用

3.       智能化     动态代理是最好的体现,即在运行阶段才指定实际代理对象(Struts如何把表单元素映射到对象上?)

使用场景   典型应用如spring AOP

扩展

1.       普通代理    要求客户端只能访问代理角色,而不能访问真实角色

2.       强制代理    要求客户端必须通过真实角色找到代理角色(演员和经纪人)

3.       虚拟代理    指在需要的时候,才初始化主题对象,可以避免被代理对象太多而引起的初始化缓慢问题

[java] view plain copy
  1. public class Proxy implements Subject{  
  2. Private Subject subject;  
  3. public void request(){  
  4. If(subject==null){  
  5. Subject = new RealSubject();  
  6. }  
  7. subject.request();  
  8. }  
  9. }  

 

 

1.       动态代理    指在实现阶段不用关心代理谁,而在运行阶段才指定代理哪个对象,动态代理根据被代理的接口生成所有的方法即给定一个接口,动态地理就宣传我已经实现该接口下的所有方法了(通过InvocationHandler接口)

 

类图

 

[java] view plain copy
  1. 源码  
  2. 1.  接口  
  3.       public interface IGamePlayer {  
  4. public void login(String user,String password);  
  5. public void killBoss();  
  6. public void upgrade();  
  7. }  
  8. 2.  实现类  
  9.  public class GamePlayer implements IGamePlayer {  
  10.     private String name="";  
  11.     public GamePlayer(String _name){  
  12.         this.name=_name;  
  13.     }  
  14.     @Override  
  15.     public void killBoss() {  
  16.         System.out.println(this.name+"在打怪");  
  17. }  
  18.     @Override  
  19.     public void login(String user, String password) {  
  20.         System.out.println("登录名为"+user+"的用户  "+this.name+"登录成功");  
  21. }  
  22.     @Override  
  23.     public void upgrade() {  
  24.         System.out.println(this.name+"又升了一级");  
  25. }  
  26. }  
  27. 3.  动态代理类  
  28.  public class GamePlayIH implements InvocationHandler {  
  29. //被代理者  
  30.     Class cls =null;  
  31.     //被代理的实例  
  32.     Object obj=null;  
  33.     //我要代理谁  
  34.     public GamePlayIH(Object _obj){  
  35.         this.obj=_obj;  
  36.     }  
  37.     //调用被代理的方法  
  38.     @Override  
  39.     public Object invoke(Object proxy, Method method, Object[] args)  
  40.             throws Throwable {  
  41.         Object result =method.invoke(this.obj, args);  
  42.         if(method.getName().equalsIgnoreCase("login")){  
  43.             System.out.println("有人登录");  
  44.         }  
  45.         else if(method.getName().equalsIgnoreCase("upgrade")){  
  46.             System.out.println("有人升级了");  
  47.         }  
  48.         return result;                                                                                                             
  49.     }  
  50. }  
  51. 4.  场景类  
  52. public class Client {  
  53.     public static void main(String[] args) {  
  54.         IGamePlayer player = new GamePlayer("郭俊");  
  55.         InvocationHandler handler = new GamePlayIH(player);  
  56.         System.out.println("开始打游戏,记下时间戳 : "+System.currentTimeMillis());  
  57.         ClassLoader c1=player.getClass().getClassLoader();  
  58.        //动态生成一个代理类  
  59.         IGamePlayer proxy = (IGamePlayer)Proxy.newProxyInstance(c1, new Class[]{IGamePlayer.class}, handler);  
  60.         proxy.login("guojun""password");  
  61.         proxy.killBoss();  
  62.         proxy.upgrade();  
  63.         System.out.println("结束时间是:"+System.currentTimeMillis());  
  64.     }  
  65. }  

原创粉丝点击