1.代理模式的介绍和设计思路
维基百科定义:代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式。所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。
著名的代理模式例子为引用计数(英语:reference counting)指针对象。当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。
2.代理模式的代码实现
1.静态代理
/**
* 抽象接口
* @author wtk
*/
public interface Subject {
void visit();
}
/**
* @program: DesignPatterns
* @description: 实现类
* @author: WangTengKe
* @create: 2018-08-30
**/
public class SubjectImpl implements Subject {
private String msg = "realSubject";
@Override
public void visit() {
System.out.println(msg);
}
}
/**
* @program: DesignPatterns
* @description: 代理类
* @author: WangTengKe
* @create: 2018-08-30
**/
public class ProxySubject implements Subject {
private Subject subject;
public ProxySubject(Subject subject){
//得到实现类
this.subject = subject;
}
@Override
public void visit() {
//访问实现类的visit的方法
subject.visit();
}
}
/**
* @program: DesignPatterns
* @description: 测试类
* @author: WangTengKe
* @create: 2018-08-30
**/
public class ProxyMain {
public static void main(String[] args){
Subject subject = new ProxySubject(new SubjectImpl());
subject.visit();
}
}
静态代理的思路是代理类实现具体类的方法。但是如果代理类的需求变化,需要改变代理类的实现。
下面看一下动态代理
/**
* 抽象接口
* @author wtk
*/
public interface Subject {
void visit();
}
/**
* @program: DesignPatterns
* @description: 实现类
* @author: WangTengKe
* @create: 2018-08-30
**/
public class SubjectImpl implements Subject{
private String msg = "realSubject";
@Override
public void visit() {
System.out.println(msg);
}
}
/**
* @program: DesignPatterns
* @description: 动态代理类
* @author: WangTengKe
* @create: 2018-08-30
**/
public class DnamicProxySubject implements InvocationHandler {
private Object object;
public DnamicProxySubject(Object object){
this.object = object;
}
public Object getDnamicProxy(){
ClassLoader classLoader = object.getClass().getClassLoader();
Object result = Proxy.newProxyInstance(classLoader,object.getClass().getInterfaces(),this);
return result;
}
/**
* @Description:
* @Param: [proxy, method, args]
* @return: java.lang.Object
* @Author: Wtk
* @Date: 2018/8/30
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(object , args);
}
}
/**
* @program: DesignPatterns
* @description: 动态代理测试类
* @author: WangTengKe
* @create: 2018-08-30
**/
public class DnamicProxyMain {
public static void main(String[] args){
//目标对象
Subject subject= new SubjectImpl();
//动态创建代理对象,将目标对象传入
DnamicProxySubject dnamicProxySubject = new DnamicProxySubject(subject);
Subject subject1 = (Subject) dnamicProxySubject.getDnamicProxy();
//访问目标对象方法
subject1.visit();
}
}
源码地址:https://github.com/wangtengke/DesignPatterns
个人博客:https://blog.csdn.net/qq_22754377