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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 列存储中常用的数据压缩算法

    列存储中常用的数据压缩算法列存储,作为一种针对数据查询和数据分析设计的数据存储策略,在“大数据”越来越普及的今天可以说是相当地火热。相较于行存储,列存储的最大优势有二,其一就是查询涉及到数据库的哪几个列就读哪几个列,不读一点与查询不相关的列,大大减少了数据的读取,其二就是数据库数据分为多个独立的列来存储,相同数据类型的数据连续存储在一起,易于数据压缩,而这再次减少了数据的读取。以上正是列存储在处理数据查询和数据分析方面的天

    2022年7月14日
    14
  • Android系统签名以及生成keystore秘钥

    Android系统签名以及生成keystore秘钥Android11系统签名以及keystore一、什么是系统签名Android下所有APP都要进行签名,而有些权限,只有系统签名了的APP可以拥有。而且需要在APP的AndroidManifest中添加以下IDandroid:sharedUserId=”android.uid.system”二、使用signapk.jar签名2.1找到对应文件(1)在根目录下创建keystore文件夹以方便工作(2)查找密钥和证书build/target/product/security/plat

    2022年6月21日
    81
  • 坑,MySQL中 order by 与 limit 混用,分页会出现问题!

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:丘八老爷 blog.csdn.net/qiubabin/article/details/70135556 在M…

    2021年6月28日
    72
  • Java链表分割_java中有没有写好的单链表

    Java链表分割_java中有没有写好的单链表描述:现有一链表的头指针ListNode*pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。/*publicclassListNode{intval;ListNodenext=null;ListNode(intval){this.val=val;}}*/publicclassPartition{publicListNo

    2022年5月3日
    40
  • RSA加密算法解读

    RSA加密算法解读图为RSA公开密钥算法的发明人,从左到右RonRivest,AdiShamir,LeonardAdleman.照片摄于1978年  RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间…

    2022年6月1日
    37
  • 补码乘法、booth算法、Wallace树

    补码乘法、booth算法、Wallace树补码乘法 booth 算法 Wallace 树补码乘法原理 booth 算法 booth 一位一乘算法 booth 两位一乘算法 Wallace 树补码乘法原理大家都来学习 booth 算法了 那么补码的加法一定了解了 即 X 补 Y 补 X Y 补 X 补 Y 补 X Y 补 X 补 Y 补 X Y 补 那么乘法同样的 我们也想用补码来表示 但是 X 补 Y 补 X Y 补 X 补 Y 补 neq X Y 补 X 补 Y 补 X Y 补 现在我们需要知道补码的定义 对于 n

    2025年6月7日
    0

发表回复

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

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