代理模式的作用是控制和管理访问
先看一段代码:
- package com.test;
- /**
- * 抽象角色
- * @author Administrator
- *
- */
- abstract public class Subject {
- abstract public void request();
- }
- package com.test;
- /**
- * 真实角色
- * @author 阳光小强
- *
- */
- public class RealSubject extends Subject{
- public RealSubject(){
- }
- public void request(){
- System.out.println("From real subject");
- }
- }
- package com.test;
- /**
- * 客户端调用
- * @author 阳光小强
- *
- */
- public class Main {
- public static void main(String[] args) {
- Subject sub = new RealSubject();
- sub.request();
- }
- }
- package com.test;
- /**
- *
- * @author 阳光小强
- *
- */
- public class ProxySubject extends Subject{
- private RealSubject realSubject; //以真实角色作为代理角色的属性
- public ProxySubject(){
- }
- @Override
- public void request() {
- preRequest();
- if(realSubject == null){
- realSubject = new RealSubject();
- }
- realSubject.request();
- postRequest();
- }
- private void preRequest(){
- //something you want to do before requesting
- }
- private void postRequest(){
- //something you want to do after requesting
- }
- }
有时候我们需要代理的对象不确定,所以就需要动态代理,Java中的动态代理模式实现如下:
- package com.test;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public class DynamicSubject implements InvocationHandler {
- private Object dele;
- public DynamicSubject(Object obj) {
- this.dele = obj;
- }
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- doBefore();
- //在这里完全可以把下面这句注释掉,而做一些其它的事情
- Object result = method.invoke(dele, args);
- after();
- return result;
- }
- private void doBefore() {
- System.out.println("before....");
- }
- private void after() {
- System.out.println("after....");
- }
- }
- package com.test;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Proxy;
- /**
- * 客户端调用
- * @author 阳光小强
- *
- */
- public class Main {
- public static void main(String[] args) throws Exception {
- RealSubject rs = new RealSubject(); //被代理的类
- InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
- Subject subject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(), ds);
- subject.request();
- }