当前位置:首页 > CN2资讯 > 正文内容

Javase 专题之 静态代理和动态代理

14小时前CN2资讯


代理:设计模式

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

图 1. 代理模式

为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。Java 动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。

 

先我先介绍下静态代理如何实现

 

/**
* 静态代理
* @author Administrator
*
*/
//接口
interface Factory {
public void create();
}
//被代理类
class NikeFactor implements Factory{
@Override
public void create() {
System.out.println("生产一批耐克衣服");
}

}

//代理类
class Proxy implements Factory{
//声明接口
Factory f;
public Proxy(Factory f) {
this.f = f;
}
@Override
public void create() {
System.out.println("代理类执行开始");
f.create();
}

}
public class Test1 {
public static void main(String[] args) {
Proxy p = new Proxy(new NikeFactor());
p.create(); //代理执行自己的方法 但是内部实际是调用被代理的方法 这个就是简单的静态代理
//如果此时我要是再有李宁的工程还得写李宁的代理这样就衍生了动态代理

}
}

为啥我们还要用动态代理我们使用静态代理不可以吗.但是你想过没有,如果我们不用动态代理我们是不是要写很多代理类,这样岂不是一个无聊的工作,就如同你买房子要找个代理,你找个媳妇要找个婚介(也算代理)哈哈哈 如果这样下去岂不是累死我们开发啊......

 

先的动态代理实现

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* 动态代理类的学习
* @author Administrator
*
*/
//动态代理使用
interface Subject{
public void action();
}
//被代理类
class RealSubject implements Subject{
@Override
public void action() {
System.out.println("我是被代理类记得执行我");
}
}

//
class MyInvocationHandler implements InvocationHandler{

Object obj ; //实现接口的被代理类的对象声明
//1, 给被代理对象的实例化即参数
//2. 返回一个代理对象 即返回值
public Object bind(Object obj){
this.obj=obj;
//这里便是动态创建代理对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), this);
}
//当通过代理对象发起对通过重写的方法调用时,都会转换如下的invoke方法的调用
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(proxy.getClass().getName());
System.out.println(method.getName());
System.out.println(args);
Object returnobj = method.invoke(obj, args);
//System.out.println(returnobj.getClass()); //此时为空
return returnobj;
}

}

public class Test2 {

public static void main(String[] args) {
//被代理对象
Subject real = new RealSubject();
//创建一个实现了InvactionHandler接口类的对象
MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
//调用blind()方法,动态返回一个同样实现了real所在类实现的接口Sub进而传统的动态代理类
Object obj = myInvocationHandler.bind(real); //这个地方返回的就是代理类的对象
Subject sub = (Subject) obj;
sub.action(); //转到对InvocationHandler接口实现类的invoke()方法的调用

//此时再用改方法调用静态代理类完成的事情
Factory f= new NikeFactor();
Factory proxyf = (Factory) myInvocationHandler.bind(f);
proxyf.create();
}
}

这样是不是很好 ,无论是买房子还是找媳妇都找一个代理就可以了.......这样是不是很好理解

 

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24239.html

    分享给朋友:

    “Javase 专题之 静态代理和动态代理” 的相关文章

    如何利用Gcore CDN自选IP优化网站访问速度与安全性

    Gcore CDN的基本功能 Gcore CDN是一种全球知名的内容分发网络服务,它为用户提供了强大的加速和保护功能。通过Gcore CDN,用户可以轻松实现网站的全球加速,确保内容能够快速、稳定地传递给终端用户。Gcore CDN的免费套餐包括每月1TB流量、10亿次请求,覆盖了140多个官方节点...

    RackNerd IPv6 设置指南:轻松配置高效网络体验

    在探索虚拟私有服务器(VPS)时,RackNerd成为了很多用户的首选。作为一家专注于高性能VPS服务的公司,RackNerd以其可靠的服务器托管解决方案而闻名。它的服务器主要部署在ColoCrossing和Multacom机房,这让RackNerd在提供服务时具备了很多灵活性和优势。 RackNe...

    推荐高效的CN2 GIA VPS解决方案与商家分析

    在如今快速发展的互联网时代,对于个人用户和企业来说,服务器的选择显得尤为重要。CN2 GIA VPS,作为一种高效的虚拟专用服务器,逐渐成为许多人青睐的选择。它是什么?到底能为我们提供什么样的服务呢?我来分享一下我对CN2 GIA VPS的理解。 CN2 GIA VPS,是一种通过中国电信的CN2...

    WordPress reCAPTCHA插件:提升网站安全与用户体验的最佳解决方案

    reCAPTCHA插件概述 在今天的网络环境中,安全性愈发重要,尤其是对于使用WordPress的网站。WordPress reCAPTCHA插件成为了一种流行的解决方案,它借助Google强大的reCAPTCHA服务,帮助我们有效地区分真实用户和可能扰乱网站的机器程序。在我接触这个插件之后,发现它...

    AT&T VPS详解:稳定性与灵活性的完美选择

    在这篇文章中,我想和大家聊聊AT&T VPS,尤其是在更广泛的虚拟私有服务器市场中,AT&T VPS代表了什么。AT&T是一家美国知名的电信运营商,其提供的VPS服务在一定程度上依赖于它的网络基础设施。这种结合了高质量网络与虚拟服务器技术的服务,吸引了大量需要高稳定性和可扩展...

    深入了解CN2 GIA VPS:选择更快稳定的虚拟专用服务器

    在现代互联网环境中,选择合适的虚拟专用服务器(VPS)至关重要。CN2 GIA VPS,则是个不错的选择。它基于中国电信的CN2 GIA国际精品网络,这一网络是中国电信下一代承载网络的高端产品,又被称为Chinatelecom Next Carrier Network- Global Interne...