Java设计模式之代理模式详细解读

 更新时间:2021年08月23日 17:28:18   作者:zsr6135  
这篇文章主要介绍了Java设计模式的代理模式,文中有非常详细的代码示例,对正在学习Java设计模式的小伙伴有很大的帮助,感兴趣的小伙伴可以参考一下

Java设计模式-代理模式

什么是代理模式?

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

所谓的代理严格来讲就是两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个辅助完成主类业务逻辑操作。

代理模式-UML图:

源代码:

interface ISubject{//操作主题
	public void get();//要钱
}
class RealSubject implements ISubject{
	public void get(){
		System.out.println("还钱");
	}
}
class ProxySubject implements Subject{//代理实现
	private ISubject sub = null;//真正的操作业务
	//在创建代理类对象的时候必须设置要代理的真实主题
	public ProxySubject(Subject sub){
		this.sub=sub;
	}
	public void prepare(){
		System.out.println("准备讨债工具");
	}
	public void destroy(){
		System.out.println("得到了欠债的费用");
	}
	public void get(){	//接口子类一定要实现抽象方法
		this.prepare();//真实操作之前的准备
		this.sub.get();//调用真实的业务逻辑
		this.destroy();//操作之后的收尾工作
	}
}
public class DaiLi{
	public static void main(String args[]){
		ISubject sub = new ProxySubject(new RealSubject());
		//通过代理类对象发出,利用代理类来实现真实的业务
		sub.get();//讨债的核心操作
	}
}

运行结果:

总结:

  1. 以后如果是自己编写的接口如果想要取得接口的 实例化对象,第一反应写工厂类
  2. 简单工厂和工厂方法模式的不同在于前者生成产生产品的行为封装在一个方法中,根据参数的类型进行实例化,同时不存在抽象接口。而后者则增加了抽象工厂,通过实现不同的工厂方法来创建不同的产品,一个方法通常对应一个产品,这种方式相较于前者扩展性更高,在需求增加时完全符合开闭原则和依赖倒置原则

应用实例:

1、Windows 里面的快捷方式。

2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。

3、买火车票不一定在火车站买,也可以去代售点。

4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。

5、spring aop。

优点:

职责清晰、高扩展性、智能化

缺点:

  1. 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  2. 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

使用场景:

按职责来划分,通常有以下使用场景:

1、远程代理。

2、虚拟代理。

3、Copy-on-Write 代理。

4、保护(Protect or Access)代理。

5、Cache代理。

6、防火墙(Firewall)代理。

7、同步化(Synchronization)代理。

8、智能引用(Smart Reference)代理。

到此这篇关于Java设计模式之代理模式详细解读的文章就介绍到这了,更多相关Java设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中IO和NIO的区别详细解析

    Java中IO和NIO的区别详细解析

    这篇文章主要介绍了Java中IO和NIO的区别详细解析,IO和NIO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO快不少,需要的朋友可以参考下
    2023-11-11
  • Java实现连接kubernates集群的两种方式详解

    Java实现连接kubernates集群的两种方式详解

    这篇文章主要为大家详细介绍了Java实现连接kubernates集群的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • nacos一直频繁的打印日志get changegroupkeys问题

    nacos一直频繁的打印日志get changegroupkeys问题

    这篇文章主要介绍了nacos一直频繁的打印日志get changegroupkeys问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • IDEA创建Maven一直爆红无法下载的问题解决办法

    IDEA创建Maven一直爆红无法下载的问题解决办法

    这篇文章主要介绍了关于IDEA创建Maven一直爆红无法下载的问题的解决办法,文中图文结合的方式给大家讲解的非常详细,对大家解决办法非常有用,需要的朋友可以参考下
    2024-06-06
  • SpringMVC配置404踩坑记录

    SpringMVC配置404踩坑记录

    本文主要介绍了SpringMVC配置404踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • Spring @Scheduled定时器注解使用方式

    Spring @Scheduled定时器注解使用方式

    这篇文章主要介绍了Spring @Scheduled定时器注解使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java中带参数的try(){}语法含义详解

    java中带参数的try(){}语法含义详解

    这篇文章主要介绍了java中带参数的try(){}语法含义详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • vue验证码组件应用实例

    vue验证码组件应用实例

    今天小编就为大家分享一篇关于vue验证码组件应用实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • maven打包时候修改包名称带上git版本号和打包时间方式

    maven打包时候修改包名称带上git版本号和打包时间方式

    这篇文章主要介绍了maven打包时候修改包名称带上git版本号和打包时间方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Springboot系列之kafka操作使用详解

    Springboot系列之kafka操作使用详解

    这篇文章主要为大家介绍了Springboot系列之kafka操作使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论