您的位置:首页 > 其它

设计模式——代理模式

2017-05-03 11:38 246 查看

代理模式的作用是控制和管理訪问

转载请说明出处:http://blog.csdn.net/dawanganban

先看一段代码:

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;
/**
* client调用
* @author 阳光小强
*
*/
public class Main {
public static void main(String[] args) {
Subject sub = new RealSubject();
sub.request();
}
}
上面代码应该非常easy看懂。以下我们使用代理模式(新增一个ProxySubject类)

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
}

}

客户实际须要调用的是RealSubject类的request()方法,如今用ProxySubject来代理RealSubject类。相同达到目的。同一时候还封装了其它方法(preRequest(),postRequest())。能够处理一些其它问题。

 

有时候我们须要代理的对象不确定,所以就须要动态代理,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;

/**
* client调用
* @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();

}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: