你的代言人-代理模式

2023-10-31 05:30
文章标签 模式 代理 代言人

本文主要是介绍你的代言人-代理模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

代理模式为其他对象提供一种代理以控制对这个对象的访问。也就是当你想访问某个对象时,不能直接访问它而需要通过它的代理对象来进行访问。就好比你要拜访某位名人,都是需要先通过他的助理,助理在这里就起到了代理的作用。

类图

在这里插入图片描述

在代理模式中,有几种角色

  • 抽象角色(AbstractSales)定义了抽象的产品
  • 真实角色(RealSales)抽象产品的实现者
  • 代理角色(ProxySales)负责代理RealSeles的所有功能

代码实现

//抽象角色
public abstract class AbstractSales {public abstract void sales();public abstract void price();
}//真实角色
public class RealSales extends AbstractSales {@Overridepublic void sales() {System.out.println("Real sales");}@Overridepublic void price() {System.out.println("Real price");}
}//代理角色
public class ProxySales extends AbstractSales {private RealSales realSales;public ProxySales(){this.realSales = new RealSales();}@Overridepublic void sales() {this.realSales.sales();}@Overridepublic void price() {this.realSales.price();}
}public class Client {public static void main(String [] args){AbstractSales sales = new ProxySales();sales.sales();sales.price();}
}输出结果
Real sales
Real price

其实,在代理类中还可以加上额外的处理,比如:

public class ProxySales extends AbstractSales {private RealSales realSales;public ProxySales(){this.realSales = new RealSales();}@Overridepublic void sales() {this.before();this.realSales.sales();this.after();}@Overridepublic void price() {this.realSales.price();}public void before(){System.out.println("sales before");}public void after(){System.out.println("sales after");}
}输出结果:
sales before
Real sales
sales after
Real price

优缺点

优点

  • 职责清晰。各司其职,各个角色不用关心非本职的事务
  • 高扩展性。具体角色不管怎么变化,都离不开抽象角色的限制,只要代理角色实现了抽象角色的功能,就不用关心具体角色的变化
  • 智能化(主要是动态代理)

缺点

  • 在客户端和真实角色之间增加了一层逻辑处理,可能会导致请求变慢
  • 实现代理需要额外的工作,有些代理的实现还比较复杂

使用场景

  • 真实角色不适合暴露出来,可以使用代理对象来进行包装
  • 远程代理、虚拟代理、Copy-on-Write 代理、防火墙(Firewall)代理等等很多使用场景

动态代理

动态代理是代理模式中的重头戏,有另外一篇文章专门来讲解动态代理的相关内容

Spring AOP知识准备-动态代理

总结一下

  • 代理模式:为其他对象提供一种代理以控制对这个对象的访问
  • 代理模式的几种角色
    • 抽象角色(AbstractSales)定义了具体的产品
    • 真实角色(RealSales)具体的产品实现者
    • 代理角色(ProxySales)负责代现RealSeles的所有功能
  • 优点
    • 职责清晰。各司其职,各个角色不用关心非本职的事务
    • 高扩展性。具体角色不管怎么变化,都离不开抽象角色的限制,只要代理角色实现了抽象角色的功能,就不用关心具体角色的变化
    • 智能化(主要是动态代理)
  • 缺点
    • 在客户端和真实角色之间增加了一层逻辑处理,可能会导致请求变慢
    • 实现代理需要额外的工作,有些代理的实现还比较复杂
  • 使用场景
    • 真实角色不适合暴露出来,可以使用代理对象来进行包装
    • 远程代理、虚拟代理、Copy-on-Write 代理、防火墙(Firewall)代理等等很多使用场景
  • 动态代理是在实现阶段不用关心代理类,而在运行阶段才指定代理的对象
  • 一般动态代理有两种实现方式:JDK动态代理、CGLIB动态代理
  • JDK动态代理,代理类与真实类实现同一接口,通过代理类实现InvocationHandler并重写invoke方法来进行动态代理的,在invoke方法中实现额外的处理。缺点:只能够代理实现了接口的类
  • CGLIB动态代理,生成的代理类继承被代理类,通过实现MethodInterceptor接口并重写intercept方法来实现额外的处理。
    缺点:因为要继承,final类以及final方法无法使用CGLIB动态代理

欢迎您关注Java天堂公众号,专注于分享Java相关技术
在这里插入图片描述

这篇关于你的代言人-代理模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/313139

相关文章

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易