• Java设计模式----代理模式(Proxy)


    1. 代理模式简介:

    代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。按照代理类的创建时期,代理类可分为静态代理和动态代理两种。

    2.  静态代理:

         静态代理类: 由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

         简单静态代理实例代码:

     定义一个接口:

    public interface BookDao {
       
    	public void addBook();
    }
    再完成这个接口的实现:

    public class BookDaoImpl implements BookDao {
    
    	@Override
    	public void addBook() {
    		
    		System.out.println("添加书....代理测试");
    		
    	}
    
    }
    BookDao代理类:

    public class BookDaoProxy implements BookDao {
      
    	private BookDao bookDao;
    		
    	/**
    	 * 构造方法
    	 */
    	public BookDaoProxy(BookDao bookDao) {
    		super();
    		this.bookDao = bookDao;
    	}
    
    	
    	@Override
    	public void addBook() {
    		
    		this.before();
    		this.bookDao.addBook();
    		this.after();
    
    	}
    	
    	public void before(){
    		System.out.println("前置处理..");
    	}
    	
    	public void after(){
    		System.out.println("后置处理");
    	}
    
    }
    静态代理测试类:

    public class TestProxy {
        
    	public static void main(String[] args){
    		BookDao bookDao=new BookDaoImpl();
    		BookDao bookDaoProxy=new BookDaoProxy(bookDao);
    		bookDaoProxy.addBook();
    	}
    	
    }
    分析上面的代码,加入需要在BookDao这个接口中增加一个queryBook() 的方法,那么我们的实现类以及代理类都需要更改,这样既不利于代码的扩展,所以对应的出现了动态代理。

    3.  动态代理:

    动态代理类:动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
    动态代理示例代码:

     定义一个接口:

    public interface BookDao {
       
    	public void addBook();
    }
    再完成这个接口的实现:

    public class BookDaoImpl implements BookDao {
    
    	@Override
    	public void addBook() {
    		
    		System.out.println("添加书....代理测试");
    		
    	}
    
    }

    代理类:

    public class ObjectProxy implements InvocationHandler {
        
    	private Object target;
    	
    	/**
    	 * 绑定委托对象并返回一个代理类对象
    	 * @param target
    	 * @return
    	 */
    	public Object bind(Object target){
    		this.target=target;
    		return  Proxy.newProxyInstance(target.getClass().getClassLoader(),
    				                       target.getClass().getInterfaces(), this);
    	}
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] arg)
    			throws Throwable {
    		Object result=null;
    		result=method.invoke(target, arg);
    		return result;
    	}
    
    }
    动态代理测试类:

    public class TestProxy {
        
    	public static void main(String[] args){
    		
    		ObjectProxy op=new ObjectProxy();
    		BookDao bd=(BookDao) op.bind(new BookDaoImpl());
    		bd.addBook();
    		
    	}
    	
    }
    从上面的代码可以看出,即使修改接口,也不会影响到代理类,方便了代码的扩展。

    并且动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类





  • 相关阅读:
    PS学习
    这是一个忧伤的故事
    数学规律——约瑟夫环问题(未完结)
    翻车总结——训练场新手村P1421 小玉买文具(C++)
    快速读入——卡常终结者(快读)
    循环练习——亲和数(未完结)
    线性DP——回文词IOI2000(未完结)
    springboot整合(预加载数据commandlinerunner)
    第一章 spring 基础
    第二章 spring 基础
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293770.html
Copyright © 2020-2023  润新知