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

代理模式与动态代理静态代理和动态代理

9小时前CN2资讯


代理模式与动态代理

1 概述

代理模式是在二十三种设计模式中比较接近现实生活和容易理解的一种设计模式,简单的来说就是A通过B的代理,与C进行通信,如图:

当然这样看来并没有增加A与C通信的效率,反而多了一层代理,但是,当A多了以后呢?

显然,这样可以只让B与C进行通信,类似于多加了一层的代理层,专门用来处理请求,再来一个现实点的例子:

如果一个人有事想找你你可以直接与他对话,而如果一群人想找你你一定不能同时与他们进行对话,就需要一个一个的回复,比如我们平常的移动联系方式微信,此时他就可以代理你进行消息的接收和回复,如图 :

因此,我们总结下代理模式的概念和优点:

定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

优点:(1)职责清晰 (2)高扩展性(3)智能化

2 代理模式(静态代理)

静态代理简单的说就是接口代理实现类,当一个或多个类实现一个接口后,需要将接口的方法进行实现,当类进行实例化时使用接口进行代理方法的实现,直接调用接口的方法而不是实现类的方法。

/**
* 代理模式(静态代理)
*
* @author 17122
*/
public class StaticProxy {
public static void main(String[] args) {
People people = new Programmer();
people.sayHello();
}
}

interface People {
/**
* sayHello方法
*/
void sayHello();
}

class Student implements People {

@Override
public void sayHello() {
System.out.println("Hello I am a Student");
}

public void study() {
System.out.println("Study");
}
}

class Programmer implements People {

@Override
public void sayHello() {
System.out.println("Hello I am a Programmer");
}

public void playCode() {
System.out.println("Play code");
}
}

3 动态代理

动态代理的实现较为复杂,因为要实现动态代理就需要依托Java的反射机制,就是JDK官方原生的代理,继承InvocationHandler接口,实现invoke方法,就可以自定义代理工具类,根据不同的类进行动态的代理。

/**
* 动态代理
*
* @author 17122
*/
public class DynamicProxy {
public static void main(String[] args) {
Boos boos = new Boos();
Worker worker = new Worker();
getDynamicProxy(worker, Worker.class);
getDynamicProxy(boos, Boos.class);
}

/**
* 动态代理实现方法
*
* @param obj
* @param clazz
*/
public static void getDynamicProxy(Object obj, Class clazz) {
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(obj);
Courier instance = (Courier) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), myInvocationHandler);
instance.takeSomething();
}
}

/**
* 快递员
*/
interface Courier {
/**
* 取东西
*/
void takeSomething();
}

class Worker implements Courier {
@Override
public void takeSomething() {
System.out.println("Worker take Something");
}
}

class Boos implements Courier {
@Override
public void takeSomething() {
System.out.println("Boos take Something");
}
}


class MyInvocationHandler implements InvocationHandler {
/**
* 被代理的目标类
*/
private Object target;

/**
* 构造方法 放入目标类
*
* @param target
*/
public MyInvocationHandler(Object target) {
this.target = target;
}

/**
* Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler.
* 返回指定接口的代理类实例,该接口将方法调用分派给指定的调用处理程序。
*
* @param proxy the class loader to define the proxy class 定义代理类的类装入器
* @param method the list of interfaces for the proxy class to implement 代理类要实现的接口列表
* @param args the invocation handler to dispatch method invocations to 将方法调用分派到的调用处理程序
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(target, args);
return result;
}
}

4 静态代理和动态代理有什么不同

(1)最主要的不同就是动态代理依靠反射机制,可以在程序运行的过程中进行被代理对象的确定,而静态代理在程序编译时期就已经确定。

(2)静态代理需要自己写代码进行完成,而动态代理就是通过Proxy.newInstance()生成。



    你可能想看:

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

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

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

    分享给朋友:

    “代理模式与动态代理静态代理和动态代理” 的相关文章

    印度尼西亚VPS服务商推荐:如何选择最佳服务提升业务效率

    1.1 地理位置优势如何影响VPS服务? 印度尼西亚位于东南亚的核心位置,这一地理位置为其VPS服务商带来了显著的优势。与中国大陆的网络直连使得ping值稳定在50-80ms之间,这对于需要低延迟连接的用户来说是一个巨大的优势。无论是进行在线游戏、视频流媒体还是其他需要快速响应的应用,这种低延迟都能...

    大陆VPS选购指南:如何选择最适合的虚拟私人服务器

    1.1 什么是大陆VPS 大陆VPS,即中国大陆的虚拟私人服务器,是一种通过虚拟化技术将一台物理服务器分割成多个独立虚拟服务器的服务。每个VPS都拥有独立的操作系统、存储空间和带宽资源,用户可以像使用独立服务器一样进行管理和配置。大陆VPS的优势在于其本地化的数据中心和网络连接,能够为国内用户提供更...

    mac ssh工具推荐:提升远程工作效率的最佳选择

    在现代计算机网络中,SSH(Secure Shell)是一个重要的工具。它为用户提供了一种安全的远程登录协议,广泛应用于网络管理、服务器配置等场景。我自己在处理多台服务器时,总是通过SSH来保证安全性和网络的高效性。通过SSH,我可以在远程计算机上执行命令和操作,感觉就像在本地电脑上一样。 在Mac...

    GMO VPS:可靠的虚拟专用服务器选择与性能分析

    在我对虚拟专用服务器(VPS)解决方案的探索中,GMO VPS引起了我的注意。作为日本GMO集团旗下的品牌,GMO VPS以其出色的性能和可靠性赢得了众多用户的信赖。我想分享一下为何这个平台如此受欢迎,以及它的相关背景和适用人群。 GMO VPS是如何运作的呢?它使用先进的虚拟技术,将物理服务器划分...

    Hostodo VPS主机使用体验与性能评测

    当我第一次听说Hostodo时,正是2014年,这家美国VPS主机商在市场上开始崭露头角。印象中,它的低价VPS产品让我感到十分吸引,尤其是在对比市场上其他的主机商时,Hostodo的性价比确实相当有优势。它主营的KVM型和NVMe硬盘的KVM型VPS在当时的市场中并不是常见的选择,迅速吸引了许多站...

    香港CDN服务:提升网站访问速度和用户体验的最佳选择

    在互联网时代,用户愈发关注访问速度和网站体验,这时CDN(内容分发网络)的作用就显得尤为重要。简单来说,CDN是通过在全球各地设置节点,帮助将内容快速传递给用户,从而减少延迟,提高访问速度。我曾经亲身体验过CDN带来的便利,当我访问一些需要加载大量图片和视频的网站时,CDN能确保这些内容更快呈现,给...