Java设计模式----代理模式(Proxy)
来源:互联网 发布:友邦qq群发软件 编辑:程序博客网 时间:2024/04/20 07:46
1. 代理模式简介:
代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。按照代理类的创建时期,代理类可分为静态代理和动态代理两种。
2. 静态代理:
静态代理类: 由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
简单静态代理实例代码:
定义一个接口:
public interface BookDao { public void addBook();}再完成这个接口的实现:
public class BookDaoImpl implements BookDao {@Overridepublic void addBook() {System.out.println("添加书....代理测试");}}BookDao代理类:
public class BookDaoProxy implements BookDao { private BookDao bookDao;/** * 构造方法 */public BookDaoProxy(BookDao bookDao) {super();this.bookDao = bookDao;}@Overridepublic 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 {@Overridepublic 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);}@Overridepublic 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方法返回的值是被代理接口的一个实现类
0 0
- JAVA设计模式- 代理模式(Proxy)
- Java设计模式----代理模式(Proxy)
- JAVA设计模式:代理(Proxy)
- Java Proxy(代理)设计模式
- Java---代理设计模式(Proxy)
- Java设计模式:Proxy(代理)
- Java设计模式:Proxy(代理)
- 【设计模式】--代理模式 (Proxy模式)
- Java设计模式-----Proxy模式(静态代理)
- Java设计模式-----Proxy模式(动态代理)
- JAVA 设计模式 代理Proxy模式 一
- Java设计模式-----Proxy模式(静态代理)
- Java设计模式-----Proxy模式(动态代理)
- java设计模式之代理模式Proxy
- Java:设计模式之代理模式Proxy
- Java设计模式十八:代理模式(Proxy)
- Java设计模式之代理模式(Proxy)
- Java设计模式 代理模式(Proxy)
- Java序列
- C++11之std::function
- px、dp和sp,这些单位有什么区别?
- Adnroid之TextView属性详解和常用特效特效用法
- BlockKit的使用
- Java设计模式----代理模式(Proxy)
- 百度地图用法封装
- hdu2368 Alfredo's Pizza Restaurant
- Java加密技术(十)——双向认证
- spring的依赖注入理解
- 【NOI2010】【BZOJ2006】超级钢琴
- TIPTOP-系統資料重整作業(p_mis)
- PHP多维数组转一维数组,多维护数组转字符串
- C++11之std::bind