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

代理设计模式设计模式 代理模式

2天前CN2资讯

静态代理

  • 抽象角色 : 一般使用接口或者抽象类来实现
  • 真实角色 : 被代理的角色,继承与抽象类
  • 代理角色 : 代理真实角色 一般会做一些附属的操作 .类似于角色增强
  • 客户 : 主函数,使用代理角色来进行一些操作

抽象角色

public interface Singer { /** * 歌星都能唱歌 */ void sing(); }

真实角色

public class MaleSinger implements Singer{ private String name; public MaleSinger(String name) { this.name = name; } @Override public void sing() { System.out.println(this.name + "开始唱歌了!"); } }

代理角色

public class Agent implements Singer { private Singer singer; public Agent(Singer singer) { this.singer = singer; } @Override public void sing() { System.out.println("节目组找过来!需要演出,谈好演出费用。。。。。"); singer.sing(); System.out.println("结算费用,下一次合作预约。。。。。。"); } }

客户

public class Client { public static void main(String[] args) { Singer singer = new MaleSinger("鹿晗"); Singer agent = new Agent(singer); agent.sing(); } }

鹿晗还是鹿晗,没有必要为了一下前置后置工作改变鹿晗这个类
公共的统一问题交给代理处理
公共业务进行扩展或变更时,可以更加方便
这不就是更加符合开闭原则,单一原则吗?

每个类都写个代理,麻烦死了。

动态代理

  • 动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的
  • 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理
    • 基于接口的动态代理----JDK动态代理
    • 基于类的动态代理–cglib(有兴趣自己研究)

jdk动态代理

【InvocationHandler:调用处理程序】

Object invoke(Object proxy, 方法 method, Object[] args); //参数 //proxy - 调用该方法的代理实例 //method -所述方法对应于调用代理实例上的接口方法的实例。方法对象的声明类将是该方法声明的接口,它可以是 代理类继承该方法的代理接口的超级接口。 //args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。原始类型的参数包含 在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean 。

【Proxy : 代理】

//生成代理类 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(),this); }

代码实现

package prox.Dprox; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Agent implements InvocationHandler { private Singer singer; public Agent(Singer singer) { this.singer=singer; } /** * 设置代理的经济人 * @param singer */ public void Agent(Singer singer) { this.singer = singer; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("---------------经纪人把把关--------------"); Object returnObj = method.invoke(singer, args); System.out.println("---------------唱完了收收钱------------------------"); return returnObj; } /** * 获取一个代理对象 * @return */ public static Object getProxy(Singer singer){ Agent agent = new Agent(singer); return Proxy.newProxyInstance(Agent.class.getClassLoader(),singer.getClass().getInterfaces(),agent ); } } package prox.Dprox; public class Client { public static void main(String[] args) { Singer singer= new MaleSinger("刘德华"); Singer agent= (Singer)Agent.getProxy(singer); agent.sing(); Singer singer1= new MaleSinger("张学友"); Singer agent1= (Singer)Agent.getProxy(singer1); agent1.sing(); } }
    你可能想看:

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

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

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

    分享给朋友:

    “代理设计模式设计模式 代理模式” 的相关文章

    DMIT Eyeball套餐:高性价比VPS解决方案实现稳定网络连接

    在探讨DMIT Eyeball套餐之前,先来了解一下它的起源。这款套餐曾被称为HKG Lite,后来进行了更名,成为了如今的Eyeball。这个变化并不仅仅是名称的调整,更是DMIT公司在提供服务方面进行的一次重要转型。DMIT Eyeball套餐主要聚焦于为中国大陆用户提供高质量的直连线路。公司在...

    Linode Speed Test:优化服务器性能的必备工具与方法

    在互联网时代,速度是衡量服务器性能的重要标准之一。Linode Speed Test 是一种专门用来评估Linode服务器速度和延迟的方法。对于任何希望评估其在线服务效率的用户来说,这项测试提供了关键的数据支持。你可以很方便地通过Linode的官网或者第三方工具来完成这一流程。 Linode成立于2...

    选择最适合的泰国VPS解决方案,助力业务成功

    我一直对网络基础设施充满好奇,尤其是虚拟专用服务器(VPS)这一概念。VPS为用户提供了一种灵活且高效的网站托管解决方案,让我觉得非常迷人。而泰国VPS更是因其独特的地理位置和网络质量,成为了许多选择者的心仪之地。 什么是VPS呢?简单地说,VPS是一种通过虚拟化技术将物理服务器划分为多个独立的虚拟...

    如何获取低价域名:选购指南与注意事项

    在当今数字化时代,网上存在着大量的低价域名和注册选项。低价域名通常是指那些价格较为便宜的域名,相比传统的域名选择,它们为个人和企业提供了更加实惠的选择。注册这些域名的方式多种多样,市场上也有许多能够提供成本效益高的选择,适合各类需求的用户。 在这个竞争激烈的网上环境中,很多人希望能以较低的成本建立自...

    APT攻击是什么及其防御措施详解

    APT攻击(Advanced Persistent Threat,高级持续性威胁)是一种复杂而长期的网络攻击模式。在我了解这个概念的过程中,逐渐意识到它不仅仅是一种攻击手段,而是一个精密的、组织化的网络战争策略。APT攻击的敌对方通常具备高超的技术能力和丰富的资源,他们的目标是破坏组织的核心设施,或...

    BBR对国内网站的实际作用与应用效果分析

    BBR(Bottleneck Bandwidth and Round-trip propagation time)算法是由Google推出的一种TCP拥塞控制算法。它的设计初衷是为了优化网络连接的传输速率和稳定性,尤其是在面临高延迟和波动网络条件时表现优异。可能的很多朋友会问,BBR到底是个什么东西...