Java设计模式(八)之结构型模式:代理模式

Java设计模式(八)之结构型模式:代理模式

一、定义:

代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法。

在我们实际生活中代理情况无处不在!你在淘宝上面买东西,你使用支付宝平台支付,卖家请物流公司发货、你请朋友帮你拿包裹,在这个过程汇总支付宝、物流公司、你朋友都扮演者“第三者”的角色在帮你完成物品的购买,这里的第三者我们可以将其称之为代理者。

所谓代理就通过引用一个新的对象来实现对真实对象的操作或者将新的对象当做真实对象的一个替身,这种实现的机制就是代理模式,通过引用代理对象来访问真实对象就是代理模式的设计动机。

1、定义:

代理模式就是给一个对象提供一个代理,并由代理对象控制原对象的引用。 在代理模式中,“第三者”代理主要是起到一个中介的作用,它连接客户端和目标对象。

2、结构图:

Java设计模式(八)之结构型模式:代理模式

在代理模式中有如下三个角色:

Subject: 抽象角色。声明真实对象和代理对象的共同接口。

Proxy: 代理角色。代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。

RealSubject: 真实角色。它代表着真实对象,是我们最终要引用的对象。

 

二、模式实现:

读大学的时候都追过女生吧!某天你看到一位美女,一见钟情,心里发誓要她做你女朋友。但是你想这样直接上去可能会唐突了。于是你采用迂回政策,先和她室友搞好关系,然后通过她室友给她礼物,然后……。

首先出现的就是美女一枚:BeautifulGirl.java

public class BeautifulGirl {
    String name;
    
    public BeautifulGirl(String name){
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

 然后是抽象主题,送礼物接口:GiveGift.java

public interface GiveGift {
    /**
     * 送花
     */
    void giveFlowers();
    
    /**
     * 送巧克力
     */
    void giveChocolate();
    
    /**
     * 送书
     */
    void giveBook();
}

你小子:You.java

public class You implements GiveGift {
    BeautifulGirl mm ;     //美女
    
    public You(BeautifulGirl mm){
        this.mm = mm;
    }
    
 
    public void giveBook() {
        System.out.println(mm.getName() +",送你一本书....");
    }
 
    public void giveChocolate() {
        System.out.println(mm.getName() + ",送你一盒巧克力....");
    }
 
    public void giveFlowers() {
        System.out.println(mm.getName() + ",送你一束花....");
    }
}

 她闺蜜室友:HerChum.java

public class HerChum implements GiveGift{
 
    You you;
    
    public HerChum(BeautifulGirl mm){
        you = new You(mm);
    }
    
    public void giveBook() {
        you.giveBook();
    }
 
    public void giveChocolate() {
        you.giveChocolate();
    }
 
    public void giveFlowers() {
        you.giveFlowers();
    }
}

 客户端:Client.java

public class Client {
    public static void main(String[] args) {
        BeautifulGirl mm = new BeautifulGirl("小屁孩...");
        
        HerChum chum = new HerChum(mm);
        
        chum.giveBook();
        chum.giveChocolate();
        chum.giveFlowers();
    }
}

 运行结果:

小屁孩...,送你一本书....

小屁孩...,送你一盒巧克力....

小屁孩...,送你一束花....

 

三、代理模式小结:

1、优点:

(1)代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

(2)代理对象可以在客户端和目标对象之间起到中介的作用,保护了目标对象。

2、缺点:

(1)由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

(2)实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

3、适用场景:

(1)远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。

(2)虚拟代理:通过使用一个小的对象代理一个大对象,这样就可以较少系统的开销。

(3)保护代理:用来控制对真实对象的访问权限。

 

四、代理模式与装饰者模式的区别:

(1)装饰模式,是为了动态增加新的行为,执行主体是原类;代理模式,是替原类操作,增加新的行为,执行主体是代理类。

(2)装饰器模式关注于在一个对象上动态的添加方法,而代理模式关注于控制对象的访问。

(3)代理模式,代理类可以对他的客户隐藏一个对象的具体信息,因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。装饰器模式,我们通常的做法是将原始对象作为一个参数传给装饰着的构造器。

即:代理模式的代理和真实对象之间的对象通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。

 

原博客链接:

https://blog.csdn.net/chenssy/article/details/11179815

 

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

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

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


相关推荐

  • 幸福课第11讲_笔记

    幸福课第11讲_笔记11例行公事1.身体反馈假说2.没有更多的自律3.认知重建4.总结:如何成为成功人士,专家5.日记知道我们为什么要考试吗?—为了让你主动去整合我们之前学过的东西,这个课每节之间有联系的,你要去总结身体反馈假说理论:你在和你自己交流,通过伪造行为上的笑等–你的思想也和其保持一致实验:内向男144分钟聊天—(异性在男生不知觉该实验的情况下,主动谈笑风生12分钟x6个x2次…

    2022年7月18日
  • java二维数组两种初始化方法[通俗易懂]

    java二维数组两种初始化方法[通俗易懂]写这篇博客的原因是因为从大一学习c语言开始就对二维数组的声明和初始化一直没有搞懂。。。。直到学到了Java依旧搞得不是很清楚。先看一道Java的基础题这道题错误的选项是B.二维数组的初始化的两种方式看了很多网上的博客,大部分都说是三种初始化的方式,我这里将其归为两种,有不同想法的小伙伴可以留言讨论。什么是二维数组:数组是一个容器,用来存储数据的。现在数组中存…

    2022年6月11日
  • 音视频的数字化原理「建议收藏」

    今天本写了篇dicom医学图像解析的文章,后面听人谈到了音视频,今天我就再从中学物理写下我理解的音视频数字化原理。**音频:**物理上说声音三要素音调,响度,音色,响度直观理解就是声音的大小,声音的高低(高音、低音),音色,又称音品这两个其实都跟频率有关。声音的数字化呢,其实来源于原理的,物理上人能听到声音频率的范围是20hz到20khz,数字化采集声音时一般时按44.1khz采集的,就是1s中采集44100次,然后用16byte2个字节来存,一个采样能存的层级就是-2的8次方到2的8次方-1层,总的就是

    2022年4月9日
  • PL/SQL 入门学习(一)

    PL/SQL 入门学习(一)在学校的时候虽说上过PL/SQL这门课,然并卵,只恨当时啊!工作关系,需要用到Oracle存储过程。我就简单看了一些教程,特此记录一下。首先,先介绍一下PL/SQL是什么?PL/SQL是是由甲骨文公司在90年代初开发,以提高SQL的功能。PL/SQL是嵌入在Oracle数据库中的编程语言之一。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点…

    2022年8月20日
  • Lena图像原图及由来[通俗易懂]

    Lena图像原图及由来[通俗易懂]莱娜图在数字图像处理学习与研究中颇为知名,常被用作数字图像处理各种实验的例图。

    2022年6月19日
  • java 日期格式化– SimpleDateFormat 的使用。字符串转日期,日期转字符串

    java 日期格式化– SimpleDateFormat 的使用。字符串转日期,日期转字符串日期和时间格式由日期和时间模式字符串指定。在日期和时间模式字符串中,未加引号的字母’A’到’Z’和’a’到’z’被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号(‘)引起来,以免进行解释。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串白话文的讲:这些A——Z,a——z这些字母(不被单引号包围的)会被特殊处理替换为对应的日期时间,其他的字…

    2022年6月12日

发表回复

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

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