学习总结与分享-设计模式之代理模式入门

DesignPattern 设计模式学习笔记(面试和工作必备) 最近有很多粉丝留言:“学设计模式有什么用啊,好像我工作中都用不到设计模式,但每次面试都要问实际项目中使用了哪些设计模式,我都答不上来。” 面对这样的问题,我想说设计模式真的很重要。曾经我也认为学设计模式没什么用,但用过了都说好。所以,猿人花了一个星期的时间给大家整理了最常用的设计模式,通过源码和文档的形式分享给大家。 希望大家认真学习掌握,真正学以致用。不仅面试时要对答如流,实际工作中也要加以应用,这样能力才会得到提升。 一、设计模式介绍 设计模式(Design pattern)代表了最佳的实践,通常被有经 阅读详情

设计模式
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。(-----摘自百度百科)
人们所熟知的设计模式共有23种,这次要研究的是其中的一种在日常开发中很常见的模式之一,代理模式。。
我们为什么要用代理模式,代理模式又是做什么的呢?
在日常开发中,我们常需要对某个或某些已经编写完成的类中的一些方法做一些代码的增强但又不需要改变代码的业务逻辑,在不改变原码的情况下这时我们就需要用到了代理模式,生成一个代理的对象来对某个或某些方法进行增强。
比如我要买一个进口的mac笔记本,而我想要便宜一些买到国外生产的不想要国产代加工,我需要找代购来帮我买,我要买mac笔记本就是本身的业务逻辑,而如何去卖到国外生产的代购,就是我的代理,这就是代理模式。
代理模式优缺点
优点:
业务类只需要关注业务逻辑本身,保证了业务类的重用性。
代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用。
缺点:
由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢;
实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度。
代理模式类型
代理模式又分为两种类型:静态代理和动态代理,两者最本质的区别就是这些对代码的增强是在代码编译时期就已经完成还是在运行时完成。
静态代理模式
静态代理模式和动态代理最大的区别就是在编译时期就已经完成了代理对象的编写与封装,完成了我想要的业务增强,以上面的业务来代码示例:

//创建抽象对象接口(Subject):声明你(本来对象)需要让代购(代理对象)帮忙做的事
(买东西)
public interface Subject {  
              public void buyMac();
}
//创建本来的买东西对象(RealSubject),即”我“
public class RealSubject implement Subject{
    @Override
    public void buyMac() {  
        System.out.println(”买一台Mac“);  
    }  
}
//创建代理对象类(Proxy),即”代购“,并通过代理类创建真实对象实例并访问其方法
public class Proxy  implements Subject{

	private RealSubject realSubject;

    @Override
    public void buyMac{
      //引用并创建真实对象实例,即”我“
      realSubject = new RealSubject();
      //调用真实对象的方法,进行代理购买Mac
      realSubject.buyMac();
      //代理对象额外做的操作
      this.WrapMac();
    }

    public void WrapMac(){
      System.out.println(”用盒子包装好Mac笔记本“);  
    }
}

//输出结果
public class ProxyPattern {

public static void main(String[] args){
    Subject proxy = new Proxy();
    proxy.buyMac();
} 
}

//买一台Mac
//用盒子包装好Mac

然而静态代理也有一些缺点:
一个静态代理只服务一种类型的目标对象,若要服务多类型的目标对象,则需要为每种目标对象都实现一个静态代理对象,在目标对象较多的情况下,若采用静态代理,则会出现 静态代理对象量多、代码量大,从而导致代码复杂,出现很多冗余代码等问题。。
要解决这个问题,就需要使用动态代理模式。
动态代理模式
动态代理的原理是设计动态代理类(DynamicProxy)时,不需要显式实现与目标对象类(RealSubject)相同的接口,而是将这种实现推迟到程序运行时由 JVM来实现
即:在使用时再创建动态代理类 & 实例
静态代理则是在代理类实现时就指定与目标对象类(RealSubject)相同的接口
通过Java 反射机制的method.invoke(),通过调用动态代理类对象方法,从而自动调用目标对象的方法
而动态代理的在拥有代理模式的优缺点下也解决了一部分静态代理时所不方便的事情,即只需要一个动态代理类就可以解决创建多个静态代理的问题,避免重复、多余代码
拥有更强的灵活性。
缺点则是:
效率低,相比静态代理中 直接调用目标对象方法,动态代理则需要先通过Java反射机制 从而 间接调用目标对象方法
动态代理又分为基于jdk的动态代理和基于cglib的动态代理,他们的区别则是jdk是基于接口的,而cglib则是基于类
jdk的动态代理
即让代理类实现与被代理类相同的接口,然后在实现某些方法时进行相应的增强(要生成代理对象需要实现InvocationHandler接口,重写invoke方法进行方法的增强,增强是基于反射进行的)
cglib的动态代理
即让代理类继承被代理类,同样也可以获取到所有被代理对象的方法,进而进行方法的增强。

代码示例:
参考链接:https://www.jianshu.com/p/5dc416ea58a2

// 1.  生成 动态代理对象
// 2.  指定 代理对象运行目标对象方法时需要完成的 具体任务
// 注:需实现InvocationHandler接口 = 调用处理器 接口
// 所以称为 调用处理器类
 public class DynamicProxy implements InvocationHandler {

// 声明代理对象
// 作用:绑定关系,即关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke()
private Object ProxyObject;

public Object newProxyInstance(Object ProxyObject){
    this.ProxyObject =ProxyObject;
    return Proxy.newProxyInstance(ProxyObject.getClass().getClassLoader(),
            ProxyObject.getClass().getInterfaces(),this);
    // Proxy类 = 动态代理类的主类 
    // Proxy.newProxyInstance()作用:根据指定的类装载器、一组接口 & 调用处理器 生成动态代理类实例,并最终返回
    // 参数说明:
    // 参数1:指定产生代理对象的类加载器,需要将其指定为和目标对象同一个类加载器
    // 参数2:指定目标对象的实现接口
    // 即要给目标对象提供一组什么接口。若提供了一组接口给它,那么该代理对象就默认实现了该接口,这样就能调用这组接口中的方法
    // 参数3:指定InvocationHandler对象。即动态代理对象在调用方法时,会关联到哪个InvocationHandler对象

}

//  复写InvocationHandler接口的invoke()
//  动态代理对象调用目标对象的任何方法前,都会调用调用处理器类的invoke()
@Override
public Object invoke(Object proxy, Method method, Object[] args)
        // 参数说明:
        // 参数1:动态代理对象(即哪个动态代理对象调用了method()
        // 参数2:目标对象被调用的方法
        // 参数3:指定被调用方法的参数
        throws Throwable {
            System.out.println("代购出门了");
            Object result = null;
            // 通过Java反射机制调用目标对象方法
            result = method.invoke(ProxyObject, args);
    return result;
}
}


//声明目标对象的抽象接口
public interface Subject {
// 定义目标对象的接口方法
// 代购物品
public  void buybuybuy();
}


//声明目标对象类
// 小成,真正的想买Mac的对象 = 目标对象 = 被代理的对象
// 实现抽象目标对象的接口
public class Buyer1 implements Subject  {
@Override
public void buybuybuy() {
    System.out.println("小成要买Mac");
}
}


// 小何,真正的想买iPhone的对象 = 目标对象 = 被代理的对象
// 实现抽象目标对象的接口
public class Buyer2 implements Subject  {
@Override
public void buybuybuy() {
    System.out.println("小何要买iPhone");
}
}
//通过动态代理对象,调用目标对象的方法
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 1. 创建调用处理器类对象
    DynamicProxy DynamicProxy = new DynamicProxy();

    // 2. 创建目标对象对象
    Buyer1 mBuyer1 = new Buyer1();

    // 3. 创建动态代理类 & 对象:通过调用处理器类对象newProxyInstance()
    // 传入上述目标对象对象
    Subject Buyer1_DynamicProxy = (Subject) DynamicProxy.newProxyInstance(mBuyer1);

    // 4. 通过调用动态代理对象方法从而调用目标对象方法
    // 实际上是调用了invoke(),再通过invoke()里的反射机制调用目标对象的方法
    Buyer1_DynamicProxy.buybuybuy();
    // 以上代购为小成代购Mac

    // 以下是代购为小何代购iPhone
    Buyer2 mBuyer2 = new Buyer2();
    Subject Buyer2_DynamicProxy = (Subject) DynamicProxy.newProxyInstance(mBuyer2);
    Buyer2_DynamicProxy.buybuybuy();
}
}

打印结果:
在这里插入图片描述

TC3xx芯片中断配置避坑指南:从AUTOSAR Davinci配置到SRN地址计算的完整流程 本文详细解析了英飞凌TC3xx芯片的中断配置流程,从AUTOSAR Davinci工具链到硬件调试的全链路指南。重点介绍了中断路由(IR)模块、服务请求节点(SRN)和中断控制单元(ICU)的配置技巧,帮助开发者避开常见陷阱,优化中断性能。 阅读详情

相关推荐

【Qt】Qt5.15在线安装避坑指南:从代理配置到组件选择的完整实践

本文详细介绍了Qt5.15在线安装的全流程避坑指南,包括代理配置、组件选择和常见问题解决方案。通过使用Fiddler工具和国内镜像源,可显著提升下载速度。文章还提供了组件选择的黄金法则和安装后的验证步骤,帮助开发者高效完成Qt5.15的安装与配置。

weixin_42550052的博客 270

代理模式学习总结

目录 代理模式 引言 定义 模式类图 代理模式类型 远程代理 虚拟代理 图片代理 Copy-on-Write代理 保护代理 缓冲代理 防火墙代理 同步化代理 智能引用代理 动态代理 总结 模式优点 模式缺点 代理模式 引言 在某些情况下,一个客户不能或者不想直接引用一个对象,此时可以通过一个称之为“代理”的第三方来间接引用。代理可以在客户端和目标对象...

江川的博客 889

# 执行 DISM 命令时出错 87 未在此上下文中识别出 restorehealth 选项。解决方法

# 执行 DISM 命令时出错 87 未在此上下文中识别出 restorehealth 选项。解决方法

段子手168的博客 1万+

【设计模式】结构型:代理模式,静态代理、动态代理(Proxy Pattern)

我具备做一件事情的能力,但是我不想和太多人直接打交道,就可以找个代理挡在我的前面,代替我和其他人交流,我只和代理交流,事情最终还是我来做,这就是代理模式。火车票由铁路局印售,全国各地都有火车票代售点,你去最近的代售点就能买到你想要的车票,不用跑去铁路局,代售点就是铁路局的车票代理人,负责代理售卖火车票。在公司上班,每月都要缴纳社保,你从来没有自己去社保中心缴纳过,都是由公司人力部门代你缴纳,人力小姐姐就是你的代理人,帮你做了这件事情。

不忘初心 方得始终 351

Calibre LVS效率翻倍秘籍:用Hierarchical Flow处理亿级晶体管设计的5个关键阶段

本文详细解析了如何利用Hierarchical Flow技术提升Calibre LVS在亿级晶体管SoC设计中的验证效率。通过五个关键阶段的分层验证流程,包括顶层抽象验证、模块级独立验证等,可显著降低内存占用40-60%,缩短迭代周期50-70%,特别适用于SMIC等先进工艺节点。文章还分享了算力资源优化、并行化处理等实战技巧,帮助工程师应对大规模芯片验证挑战。

sam99的博客 768

Lumerical官方案例、FDTD时域有限差分法仿真学习(三)——环形谐振器(Ring resonator)之第二&第三部分

二、使用 MODE 的参数提取和蒙特卡罗 三、最终参数提取

weixin_45719141的博客 1万+

Redis Cluster:从数据分布到故障转移的全方位解读

本文深入探讨了Redis Cluster的核心原理与实现,涵盖了数据分布、节点通信、集群伸缩、请求路由、故障转移及运维管理等多个方面。文章首先介绍了Redis Cluster的三种数据分布方案,重点分析了虚拟槽分区方案的优势。随后,详细解析了节点间的Gossip消息通信机制以及请求路由原理,帮助读者理解集群的高效运作。对于集群的扩容与缩容,本文提供了操作步骤与注意事项,特别关注了故障转移机制与集群运维中的挑战。通过这些内容,读者可以更好地掌握Redis Cluster的架构与实践,提升分布式系统的性能与可靠

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 178万+

详解Xilinx FPGA高速串行收发器GTX/GTP(1)--SerDes和GTX的关系

详解Xilinx FPGA高速串行收发器GTX/GTP(1)--SerDes和GTX的关系

孤独的单刀 4350

【设计模式】代理模式总结(静态代理、动态代理)

代理模式 代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。 静态代理 这种代理方式需要代理对象和目标对象实现一样的接口。 特点 冗余。由于代理对象要实现与目标对象一致的接口,会产生过多的代理类。 不易维护。一旦接口增加方法,目标对象与代理对象都要进行修改。 静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件 接口 public interface IUserDao { public void save(); } 实现类

张雨的博客 243

越野换了逐飞的ips200pro的屏幕后代码烧录中报错: “Cannot initialize device connection” 和 “Flashing failed” ...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1150

TEA-Tiny Encryption算法在FPGA的实现

在FPGA原型中,我们定义了一个TEA_FPGA模块,该模块包含一个输入数据端口(plain)、一个输入密钥端口(key)和一个输出数据端口(cipher)。在模块中,我们通过32轮的循环处理来实现TEA算法的加密过程,并将最终结果存储在cipher变量中。由于FPGA硬件的高速性能,这种基于HDL的TEA算法实现可以在短时间内完成大量的数据加密处理,从而提高加密效率和性能。总之,在FPGA中实现TEA算法可以大大提高加密效率和性能,通过使用硬件描述语言HDL来实现可以更高效、更快速地完成数据加密操作。

BitSlinger的博客 272

代理模式总结

1 简介 代理模式也被陈各位委托模式,它是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场景有很多,比如代理上网、打官司等。 定义:为其他对象提供一种代理以控制对这个对象的访问。 代理模式的结构如下图所示: 在代理模式中有如下角色: Subject:抽象主题类,声明真实主题与代理的共同接口方法 RealSubject:真实主题类,代理类所代表的真实主题。客户端通过代理类间接的调用真实...

weixin_34358365的博客 139

12、认知地图的建模与学习

本博客系统介绍了认知地图的定义、背景及其在机器智能领域的应用,重点探讨了模糊认知地图(FCMs)的建模方法与优势。文章还对比分析了几种主流的认知地图模型(如Axelrod模型、Kosko模型等),并讨论了模型的稳定性条件及实际应用前景。通过智能制造和医疗诊断的具体案例,展示了认知地图在复杂因果推理中的强大能力,并提出了模型优化方向与未来研究展望。

plant的博客 209

23种设计模式之代理模式(Proxy Pattern)

本篇文章将23种设计模式中的代理模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

分享一下设计模式的学习

设计模式是在软件设计过程中,经过实践和总结得出的描述、解决软件设计问题的一种经验总结。它是一种被广泛接受和验证的最佳实践,用于解决特定类型的问题,并提供了可重用的解决方案。设计模式提供了一种在特定情境下构建和组织代码的方式,以解决常见的设计问题。它们是根据软件设计原则和设计思想来定义的,可以帮助软件开发人员更好地理解和解决相似的设计问题。设计模式的目标是提高软件设计的可复用性、可扩展性和易维护性。它们通过使用已经被验证的解决方案来减少重复的代码编写,并使软件设计更加灵活和可扩展。

m0_64201189的博客 1099

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式之代理模式学习分享[Darren]

很高兴又在每晚的这个时候和博友有分享今天的学习成果了,感谢大家一直对Darren的支持,也希望各位博友们能将自己的好文章分享出来,在此Darren只是抛砖,希望大家不要吝啬自己的学识,江海之大,汇集于河流。不多说了,直接进入主题。   先介绍大力模式的定义: 为其它对象提供一个代理来控制对这个对象的访问。 定义是不是挺简单的? 下面送上代理模式的结构图 这个图也不难,大家一看都会看

星火燎猿 1656

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

白话设计模式之(19):代理模式与观察者模式的深度剖析

大家好!在技术学习的漫漫长路上,我始终坚信分享能让我们共同成长,一起攻克各种技术难题。今天,咱们深入探讨设计模式中的代理模式和刚引入的观察者模式(先简单带过引入部分,重点在代理模式剖析,后续会详细展开观察者模式),代理模式就像是对象访问的“智能管家”,而观察者模式则像是消息传递的“顺风耳”。希望通过这篇博客,大家能对这两种模式有更清晰的认识,在编程的道路上更进一步。

wj_rdk的博客 1506

JavaScript设计模式(四)——策略模式、代理模式、观察者模式

本文我们介绍了策略模式、代理模式和观察者模式,快来一睹为快吧...

HuoZhiyan 的博客 1756

学习设计模式之代理模式

一、定义 代理模式有点像老大和小弟,也有点像分销商。 主要解决的是问题是为某些资源的访问、对象的类的易用操作上提供方便使用的代理服务。而这种设计思想的模式经常会出现在我们的系统中,或者你用到过的组件中,它们都提供给你一种非常简单易用的方式控制原本你需要编写很多代码的进行使用的服务类。 类似这样的场景可以想到: 你的数据库访问层面经常会提供一个较为基础的应用,以此来减少应用服务扩容时不至于数据库连接数暴增。 使用过的一些中间件例如;RPC框架,在拿到jar包对接口的描述后,中间件会在服务启动的时候生成对应

南淮北安的博客 332

白话设计模式之(16)代理模式:对象访问的“安全卫士与优化助手”

大家好!在技术学习的道路上,我始终相信分享能让我们携手共进,攻克各种技术难题。今天,咱们继续深入探讨设计模式中的代理模式,它就像对象访问的“安全卫士”和“优化助手”,既能保障对象的安全访问,又能优化系统性能。希望通过这篇博客,大家能更深入地理解并灵活运用这个强大的设计模式。

wj_rdk的博客 1179

导学《Java设计模式宝典:从入门到精通》

在本篇文章中,我将带领大家系统地学习Java设计模式,从基础到进阶,全面解读每种设计模式的核心概念及实际应用。文章以《黑马程序员Java设计模式详解》为基础,结合精心编写的代码示例,帮助读者掌握设计模式的实际应用。同时,参考经典书籍《设计模式:可复用面向对象软件的基础》,提供更加深入的理论支持。

程序员-杨胡广的博客 2176

实战代理模式

有些时候你的技术成长缓慢也是因为你的不同选择而导致的,小公司确实要接触各个环境,但往往如果你所做的业务体量不高,那么你会用到的技术栈就会相对较少,同时也会技术栈研究的深度也会较浅。但在高体量、高并发的业务场景下,每一次的压测优化,性能提升,都像在研究一道数学题一样,反复的锤炼,压榨性能。没有太多的挑战,也没参与过较大体量的业务场景,除了这些开发场景因素外,还有缺少组内的技术氛围和技术分享,没有人做传播和布道者,也缺少自己对各项技术学习的热情,从而导致一直游荡在瓶颈之下,难以提升。使用过的一些中间件例如;

小凯的博客 910

设计模式之代理模式

文章目录定义代理的优点静态代理动态代理几种代理的区别 Provide a surrogate or placeholder for another object to control access to it. 定义 为其他对象提供一种代理以控制对这个对象的访问。 代理模式的通用类图: Subject抽象主题角色,可以是抽象类也可以是接口,一个普通业务类型定义 RealSubject具体主题角色,是业务逻辑的具体执行者 Proxy代理主题角色。对具体主题角色的应用,把所有抽象主题类定义的方法委托给R

Eamon 732

Java代理模式

java代理模式在java中是一种常见的设计模式,它主要用于在不直接访问对象的情况下提供对该对象的控制,可以在不改变源代码的情况下,为我们提供额外的功能。代理模式可以分为和两种形式。

qq_74399866的博客 1305

熬夜学Java语言-设计模式之代理模式

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!64538)][外链图片转存中…(img-0e7TlUrB-1713752864538)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_83330193的博客 946

【分享】从Mybatis源码中,学习到的10种设计模式

23种设计模式,Mybatis源码中竟然用了一半!怒卷Mybatis设计模式,从源码中学习设计模式,太爽了!

bugstack虫洞栈 1802
上一篇: 学习总结与分享-MySQL的优化(完结篇)
下一篇: 学习总结与分享-设计模式之观察者模式
VolcanoWec
博客等级 码龄8年 0粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值