zoukankan      html  css  js  c++  java
  • java代理模式

      代理模式分为静态代理与动态代理

    1、静态代理

      静态模式代理步骤

      1)、定义一个接口

        

    package com.mr.cheng.proxy;
    /**
    * 动物属性接口
    * @author zwc
    *
    */
    public interface Animal {
    public void canSpeak();
    public void canRun();
    }
    

      

      2)、定义该接口的实现类

    package com.mr.cheng.proxy;
    /**
     * 接口实现类
     * @author zwc
     *
     */
    public class Monkey implements Animal {
    
    	@Override
    	public void canSpeak() {
    		System.out.println("动物可以交,喊!");
    	}
    
    	@Override
    	public void canRun() {
    		System.out.println("动物可以跑!");
    	}
    
    }
    

      

      3)、定义一个静态代理类

      

    package com.mr.cheng.proxy;
    /**
     * 代理类
     * @author zwc
     *
     */
    public class AnimalProxy implements Animal {
    	private Animal animal;
    	public AnimalProxy(Animal animal){
    		this.animal = animal;
    	}
    	@Override
    	public void canSpeak() {
    		animal.canSpeak();
    	}
    
    
    	@Override
    	public void canRun() {
    		animal.canRun();
    	}
    
    }
    

      

      4)、测试该静态代理

    package com.mr.cheng.proxy;
    
    public class AnimalTest {
    
    	public static void main(String[] args) {
    		Animal animal = new Monkey();
    		AnimalProxy animalProxy = new AnimalProxy(animal);
    		animalProxy.canRun();
    		animalProxy.canSpeak();
    	}
    
    }

    总以上代码可以看得出,接口如果新增一个实现类,必须新增一个代理。这样代码重复性就非常的高。动态代理就可以避免这种现象。

      

    2、动态代理

      代理模式分为jdk代理与cglib代理

    jdk代理,代理类必须实现InvocationHandler类中的invoke方法,

      1)、定义一个接口

        

    package com.mr.cheng.proxy;
    
    public interface BookInter {
    	public void canRead();
    }
    

      

      2)、定义一个接口实现类

    package com.mr.cheng.proxy;
    
    public class BookInterImpl implements BookInter {
    
    	@Override
    	public void canRead() {
    		System.out.println("书是用来阅读的!");
    	}
    
    }
    

      

      3)、定义jdk代理

    package com.mr.cheng.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    /**
     * jdk代理 必须实现InvocationHandler类
     * @author zwc
     *
     */
    public class BookProxy implements InvocationHandler{
    	private Object object;
    	/**
    	 * 绑定委托对象并返回一个代理类。
    	 * @param target
    	 * @return
    	 */
    	 public Object bind(Object target) {  
            this.object = target;  
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),  
                    target.getClass().getInterfaces(), this);   
        }
    	 /**
    	  * 重新invoke调用方法
    	  */
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args)
    			throws Throwable {
    		 Object result=null;  
    		System.out.println("方法开始调用");
    		result = method.invoke(object, args);
    		System.out.println("方法结束调用");
    		return result;
    	}  
    
    
    }
    

      4)、测试

    package com.mr.cheng.proxy;
    
    public class BookTest {
    	public static void main(String[] args) {
    		BookProxy BookProxy = new BookProxy();
    		BookInter bookInter = (BookInter) BookProxy.bind(new BookInterImpl());
    		bookInter.canRead();
    	}
    }


      

    参考:http://kuangbaoxu.iteye.com/blog/192804  http://www.open-open.com/home/space-24-do-blog-id-12.html
  • 相关阅读:
    C# webservice服务跟踪调试方法(转)
    ServiceBase.OnStart 方法
    基本类型和引用类型
    js基本概念
    在HTML中使用JavaScript
    js中的this
    SQL 取两日期的记录
    常用数据结构[转]
    How to: Pass Values Between ASP.NET Web Pages
    example for store procedure with both transcration and error handling
  • 原文地址:https://www.cnblogs.com/chengAddress/p/4322777.html
Copyright © 2011-2022 走看看