代理模式
来源:互联网 发布:linux不保存退出vi 编辑:程序博客网 时间:2024/05/17 21:56
一、什么是代理模式
Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。
所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标
动态代理的例子:
Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。
所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标
类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。
二、代理模式的结构
三、代理模式的角色和职责
subject(抽象主题角色):
真实主题与代理主题的共同接口。
RealSubject(真实主题角色):
定义了代理角色所代表的真实对象。
Proxy(代理主题角色):
含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。
四、动态代理
1. InvocationHandler 接口
2. invoke方法
3. Proxy.newProxyInstance();
Subject.java public interface Subject { public void sailBook(); } RealSubject.java public class RealSubject implements Subject { public void sailBook() { System.out.println("卖书"); } } ProxySubject.java public class ProxySubject implements Subject{ private RealSubject realSubject; public void sailBook() { dazhe(); if(realSubject == null) { realSubject = new RealSubject(); } realSubject.sailBook(); give(); } public void dazhe() { System.out.println("打折"); } public void give() { System.out.println("赠送代金券"); } } MainClass.java public class MainClass { public static void main(String[] args) { ProxySubject proxySubject = new ProxySubject(); proxySubject.sailBook(); } }
动态代理的例子:
Subject.java package com.ibeifeng.news; public interface Subject { public void sailBook(); } RealSubject.java package com.ibeifeng.news; public class RealSubject implements Subject { public void sailBook() { System.out.println("卖书"); } } MyHandler.java package com.ibeifeng.news; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MyHandler implements InvocationHandler { private RealSubject realSubject; public void setRealSubject(RealSubject realSubject) { this.realSubject = realSubject; } public Object invoke(Object proxy, Method method, Object[] args){ Object result = null; dazhe(); try { result = method.invoke(realSubject, args); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } give(); return result; } public void dazhe() { System.out.println("打折"); } public void give() { System.out.println("赠送代金券"); } } MainClass.java package com.ibeifeng.news; import java.lang.reflect.Proxy; public class MainClass { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); MyHandler myHandler = new MyHandler(); myHandler.setRealSubject(realSubject); Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(), realSubject.getClass().getInterfaces(), myHandler); proxySubject.sailBook(); } }
0 0
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-静态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 代理模式--静态代理
- 代理模式!
- 代理模式
- head first series 学习记录(Python)
- java枚举类型enum的使用
- jquery-easyui 后台加载数据的问题
- WPF语法高亮控件AvalonEdit
- 当一种信奉根深柢固的时分,慢慢地表面也会发生改变
- 代理模式
- tomcat启动的时候,没加载xml配置文件
- float 与double 的区别
- ios中frame与bounds区别
- C#遍历指定文件夹中的所有文件
- Classifier4J的中文支持
- Android通过XML来定义Menu
- Hadoop到底能做什么?怎么用hadoop?
- java 枚举类型enum 的使用