代理模式(proxy)

前言 代理模式是一个大类,而且会经常用到,它包含了远程代理,虚拟代理,防火墙代理等,当然还有动态代理了,学过spring的人应该不陌生。 各种代理模式样式差别很大,不容易从程序上辨认,但是可以从功能上认出来,今天我就举个例子聊聊代理模式最基本的样子,从例子中认识代理模式。 举例为静态代理的基本应用,稍后再介绍代理模式的一些特点。  情境引入      本次我们以滴滴为例…

大家好,又见面了,我是你们的朋友全栈君。

前言

    • 代理模式是一个大类,而且会经常用到,它包含了远程代理,虚拟代理,防火墙代理等,当然还有动态代理了,学过spring的人应该不陌生。
    • 各种代理模式样式差别很大,不容易从程序上辨认,但是可以从功能上认出来,今天我就举个例子聊聊代理模式最基本的样子,从例子中认识代理模式。
    • 举例为静态代理的基本应用,稍后再介绍代理模式的一些特点。

 

情境引入

       本次我们以滴滴为例,滴滴在8.23接到乘客的投诉电话,因此是可以接受投诉的,只不过投诉处理不及时,而8.24日,警方打电话给滴滴客服,滴滴客服却没有权限查询犯罪嫌疑人的出车记录,说明滴滴客服只是滴滴的一个代理,而有权限的做查询的则是滴滴公司。因此本本例中滴滴客服作为代理,代理滴滴公司。

 

角色组成(代理模式的基本组成)

抽象主题角色

一个抽象接口(滴滴)

具体主题角色

需要被代理的对象(滴滴公司)

代理角色

对象的代理(滴滴客服)

 

程序类图

代理模式(proxy)

 

java源程序

滴滴接口

package proxy_08;

public interface Didi {
	public void complain();//可以投诉
	public void queryCarRecord();//可以查询出车记录
}

滴滴公司(主题)

package proxy_08;

public class DidiCompany implements Didi{

	public void complain() {
		System.out.println("收到投诉,请耐心等待处理结果");
	}

	public void queryCarRecord() {
		System.out.println("正在查询出车记录,请耐心等待");
	}

}

滴滴客服(代理)

package proxy_08;

public class DidiCallCenterProxy implements Didi{
	DidiCompany didi;
	public DidiCallCenterProxy(DidiCompany didi) {
		this.didi=didi;
	}
	public void complain() {
		didi.complain();//调用主题的方法
	}

	public void queryCarRecord() {
		System.out.println("不好意思,一线客服没有权限,请去总公司查询");
	}

}

客户端

package proxy_08;

public class Client {
	public static void main(String[] args) {
         	DidiCompany dc=new DidiCompany();
 		Didi didi=new DidiCallCenterProxy(dc);//生成代理对象
		didi.complain();//投诉
 		didi.queryCarRecord();//查询出车记录
	}
}

运行结果

      代理模式(proxy)

 

实例分析

       从举例中我们可以看出 ,由于代理与被代理实现了相同的接口,因此代理模式可以代理对象的方法,而代理模式的一个用处也就显而易见了,代理模式可以有选择的暴露对象的接口,而对访问者屏蔽一些接口,这样就实现了对对象的控制访问。当然代理模式用途细分就比较多了,但核心都完成了对被代理对象的控制访问。

现在我们在重新看代理模式 就应该清楚多了

 

定义

代理模式为对象提供一个替身或者占位符以控制对这个对象的访问

 

应用场景

  1. 应用远程代理控制访问远程对象
  2. 虚拟代理控制访问创建开销大的对象
  3. 保护代理基于权限控制对资源的访问
  4. 动态代理去看aop就行了

 

代理模式优点

    • 实现了访问者与访问对象之间的解耦
    • 代理模式在客户端与对象之间起到中介作用,保护了对对象的访问
    • 代理模式可以在访问过程中增加逻辑(aop)

 

缺点

       增加代理会使程序请求处理变慢

 

代理模式与装饰者模式对比

    看类图就知道代理模式和装饰者模式长的是真像,但是说区分他们也容易

差别

代理模式

装饰者模式

相同点

都有统一的接口

 

相同点

代理模式和对象都实现了接口

装饰者和对象也实现了接口

相同点

都完成了对对象的包装

 

不同

代理包装对象是为了控制对对象的访问

装饰者是为了给对象添加行为

 

运用简单工厂

       由于对象的生成放在了客户端,我们可以轻易看出运用了代理模式,现在我们用简单工厂封装一下对象的创建,在看看客户端有什么变化,还能不能认出来应用了代理模式呢?

 

引入简单工厂

package proxy_08;

public class DidiFactory {
	Didi didi;
	public Didi getInstance(){
		didi=new DidiCallCenterProxy(new DidiCompany());//建立代理对象
		return didi;
	}
}

修改客户端(别的类不用动)

package proxy_08;

public class Client {
	public static void main(String[] args) {
		DidiFactory df=new DidiFactory();
		Didi didi=df.getInstance();
		didi.complain();
		didi.queryCarRecord();
	}
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124784.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 交换机划分vlan配置_同一交换机vlan互通

    交换机划分vlan配置_同一交换机vlan互通原标题:一步步详解华为交换机配置实例,一看就会实例一、配置交换机的vlan,使同vlan交换机互通在项目中,给网络项目划分vlan,这个是最常见的配置,基本上大部分项目都有的,那么如何来划分vlan呢?使同vlan的主机能够互相通信呢?我们来看下下面案例。如下图:LSW1与LSW2都是三层交换机,现在两台交换机分别连着两台pc。其中:LSW1的0/0/1端口连着pc1,0/0/2连着pc2,0/0…

    2022年9月19日
    0
  • 2021年 全网最细大数据学习笔记(一):初识 Hadoop

    2021年 全网最细大数据学习笔记(一):初识 Hadoop文章目录一、大数据1、大数据的定义2、大数据的特点3、大数据行业应用4、Hadoop与大数据5、其他大数据处理平台6、大数据人才三、一、大数据随着近来计算机技术和互联网的发展,大数据这个名词越来越多地进入到我们的视野中,大数据的快速发展也无时刻影响着我们的生活。1、大数据的定义大数据从字面来理解就是大量的数据。日常生活离不开数据,可以说每时每刻都在产生着数据。例如,一分钟可以做些什么事呢?在日常生活中,一分钟可能连一页书都看不完。但是一分钟内产生的数据却是庞大的。据统计,在一分钟内,YouTu

    2022年6月4日
    29
  • mean shift应用_使用Google地图制作MEAN应用(第二部分)

    mean shift应用_使用Google地图制作MEAN应用(第二部分)meanshift应用介绍(Introduction)Welcomeback!欢迎回来!Lasttime,wecreatedanapplicationthatintegratedGoogleMapsdirectlyintotheMEANstack.Theappprovidedusapaneltocreateusers,tagthe…

    2022年5月15日
    33
  • 史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)

    史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)原文地址:https://blog.csdn.net/forezp/article/details/69808079上一篇文章,讲述了如何通过RestTemplate+Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务。一、Feign简介Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可…

    2022年6月25日
    24
  • Mac搭建PHP环境[通俗易懂]

    Mac搭建PHP环境[通俗易懂]一、配置环境1启动APacheMac系统本身自带Apache,所以可以直接打开。以下为两种方式:打开“系统设置偏好(SystemPreferences)”->“共享(Sharing)”->“Web共享(WebSharing)”打开“终端(terminal)“,然后输入sudoapachectlstart,使Apache运行。开启Apache就是开启Web共享,这时输入“http://localhost”,就可以看到“Itworks!”的页面Apache默认根目

    2022年9月22日
    0
  • activiti 任务节点 处理人设置

    activiti 任务节点 处理人设置1.1.1.前言我们在使用activiti工作流引擎的时候,最常用的肯定是任务节点,因为在OA系统、审批系统、办公自动化系统中核心的处理就是流程的运转,流程的运转依赖于人员如何设置,人员的设置是非常重要的一个环节,所以说如果能让activiti工作流引擎运转的核心,就必须要支持强大的人员组织架构设计。下面我们先说一下activiti工作流引擎自身支持的可以直接使用的地方。我…

    2022年6月23日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号