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

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • GitHub 版本控制 项目托管 03 建立本地与远程的SSH连接

    GitHub 版本控制 项目托管 03 建立本地与远程的SSH连接

  • 怎样推断一棵二叉树是全然二叉树

    怎样推断一棵二叉树是全然二叉树

  • PriorityQueue 源码分析[通俗易懂]

    PriorityQueue 源码分析[通俗易懂]学过数据结构的人应该对Queue队列很熟悉了,队列是一种先进先出(FIFO)的数据结构,所以它出队列的优先级就是进入队列的次序。但我们有时候需要其它的优先级,很多高级语言都会提供带优先级的队列,在Java中就是PriorityQueue了,今天我们来看下PriorityQueue的使用和实现。使用PriorityQueue的使用很简单,如下。publicstaticvoidm…

  • trylock 用法_Java lock

    trylock 用法_Java lock在并发编程中,为了避免多线程同时读写共享资源,我们需要互斥。Go标准库提供了互斥锁sync.Mutex,通过加锁Lock()方法和解锁Unlock()方法达到对共享资源的并发控制。在之前的设计中,当锁被占有,其他goroutine尝试获取锁时会被阻塞。这种方式当然是合理的,但是在某些情况下,或许我们希望在获取锁失败时,并不想停止执行,而是可以进入其他的逻…

    2022年10月10日
  • 操作系统栈溢出检测之ucosII篇[通俗易懂]

    操作系统栈溢出检测之ucosII篇[通俗易懂]操作系统栈溢出检测之uc/osII篇Author              :     DavidLin(林鹏)E-mail               :       linpeng1577@gmail.com                                    linpeng1577@163.com 158820224344@163.co

  • 指令重排详解_cpu指令重排序

    指令重排详解_cpu指令重排序指令重排:编译器指令重排,cpu指令重排,内存指令重排。编译器可能会调整顺序,如下图,左边是c++源码,右边是优化后顺序一条汇编指令的执行是可以分为很多步骤的,分为不同的硬件执行取指IF译码和取寄存器操作数ID执行或者有效地址计算EX(ALU逻辑计算单元)存储器访问MEM写回WB(寄存器)指令重排只可能发生在毫无关系的指令之间,如果指令之间存在依赖关系,则不会重排。单线程内程序的执行结果不能被改变。1原子性是指一个操作是不可中断的.

    2022年10月17日

发表回复

您的电子邮箱地址不会被公开。

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