本篇内容主要讲解“什么是静态代理设计模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是静态代理设计模式”吧!
代理设计模式是在程序开发中使用最多的设计模式,代理设计模式的核心是有真实业务实现类和代理业务实现类,并且代理类要完成比真实业务更多的处理操作。
所有的代理设计模式如果按照设计要求来说,必须是基于接口的设计,也就是说需要首先定义出核心接口的组成。
范例:模拟一个消息发送的代理操作结构(传统代理设计)
public class JavaAPIDemo {public static void main(String[] args)throws Exception{
IMessage message=new MessageProxy(new MessageReal());
message.send();
}
}interface IMessage{ //传统代理设计必须有接口public void send(); //业务方法}class MessageReal implements IMessage {@Overridepublic void send() {
System.out.println("【发送消息】www.mldn.cn");
}
}class MessageProxy implements IMessage { //代理类private IMessage message; //代理对象,一定是业务接口实例public MessageProxy(IMessage message){this.message=message;
}@Overridepublic void send() {if(this.connect()){this.message.send(); //消息的发送处理this.close();
}
}public boolean connect(){
System.out.println("【消息代理】进行消息发送通道的连接。");return true;
}public void close(){
System.out.println("【消息代理】关闭消息通道。");
}
}
执行结果:
以上的操作代码是一个最为标准的代理设计,但是如果要进一步的去思考会发现客户端的接口与具体的子类产生了耦合问题,所以这样的操作如果从实际的开发来讲,最好再引入工厂设计模式进行代理对象的获取。
以上的代理设计模式为静态代理设计,这种静态代理涉及的特点在于:一个代理类只为一个接口服务,如果现在准备有3000个业务接口,则按照此种做法就意味着需要编写3000个代理类,并且这些代理类操作形式类似。
所以现在需要解决的问题在于:如何可以让一个代理类满足于所有的业务接口操作要求。
通过静态代理设计模式的缺陷可以发现,最好的做法是为所有功能一致的业务操作接口提供有统一的代理处理操作,而这就可以通过动态代理机制来实现,但是在动态代理机制中需要考虑到如下几点问题:
不管是动态代理类还是静态代理类都一定要接收真实业务实现子类对象;
由于动态代理类不再与某一个具体的接口进行捆绑,所以应该可以动态获取类的接口信息。
动态代理设计模式
在进行动态代理实现的操作中,首先需要关注的就是一个InvocationHandler接口,这个接口规定了代理方法的执行。
public interface InvocationHandler{/** * 代理方法调用,代理主体类中执行的方法最终都是此方法 * @param proxy 要代理的对象 * @param method 要执行的接口方法名称 * @param args 传递的参数 * @return 某一个方法的返回值 * @throws Throwable 方法调用时出现的错误继续向上抛出 */public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
在进行动态代理设计时,对于动态对象的创建是由JVM底层完成的,此时主要依靠的是java.lang.reflect.Proxy程序类,而这个类中只提供了一个核心方法:
代理对象:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
ClassLoader loader:获取当前真实主体类的ClassLoader;
Class<?>[] interfaces:代理是围绕接口进行的,所以一定要获取真实主体类的接口信息;
InvocationHandler h:代理处理的方法;
范例:实现动态代理机制
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JavaAPIDemo {public static void main(String[] args)throws Exception{
IMessage msg=(IMessage)new MLDNProxy().bind(new MessageReal());
msg.send();
}
}class MLDNProxy implements InvocationHandler{private Object target; //保存真实业务对象/**
* 进行真实业务对象与代理业务对象之间的绑定处理
* @param target 真实业务对象
* @return Proxy生成的代理业务对象
*/public Object bind(Object target){this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
}public boolean connect(){
System.out.println("【消息代理】进行消息发送通道的连接。");return true;
}public void close(){
System.out.println("【消息代理】关闭消息通道。");
}@Overridepublic Object invoke(Object pro, Method method, Object[] args) throws Throwable {
System.out.println("*****【执行方法: 】"+method);
Object returnData = null;if(this.connect()){
returnData = method.invoke(this.target, args);this.close();
}return returnData;
}
}interface IMessage{ //传统代理设计必须有接口void send(); //业务方法}class MessageReal implements IMessage {@Overridepublic void send() {
System.out.println("【发送消息】www.mldn.cn");
}
}
执行结果:
如果认真观察系统中提供的Proxy.newProxyInstance()方法,会发现该方法会使用大量的底层机制来进行代理对象的动态创建,所有的代理类是符合所有相关功能需求的操作功能类,它不再代表具体的接口,这样在处理时就必须依赖于类加载器与接口进行代理对象的伪造。
到此,相信大家对“什么是静态代理设计模式”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/1240933/blog/5021117