结构型设计模式02-代理模式

简介: 结构型设计模式02-代理模式

理模式

1、不使用代理模式

举例说明:小明喜欢一个女生(小红),因为小红不认识小明,所以小明通过叫小华代替他送礼物给小红

可以得出的结果图:

被追求者:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:06
 *  目标对象:被追求者小红
 */
public class ObjectGirl {
    private String girlName;
    public String getGirlName() {
        return girlName;
    }
    public void setGirlName(String girlName) {
        this.girlName = girlName;
    }
}


追求者:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:04
 * 追求者
 */
public class Pursuit {
    private ObjectGirl girl;
    public Pursuit(ObjectGirl girl) {
        this.girl = girl;
    }
    public void giveFlowers() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的花。");
    }
    public void giveChocolate() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的巧克力。");
    }
    public void giveDolls() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的洋娃娃。");
    }
}


测试类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:09
 */
public class ProxyTest {
    public static void main(String[] args) {
        ObjectGirl xiaohong = new ObjectGirl();
        xiaohong.setGirlName("小红");
        Pursuit xiaoming = new Pursuit(objectGirl);
        xiaoming.giveDolls();
        xiaoming.giveFlowers();
        xiaoming.giveChocolate();
    }
}


但是你会发现,如果是这样实现的哇,就相当于小明和小红之间是认识的,但是我们的例子是说小明和小红之间不认识,所以说这样子是不能的,所以说我要通过小华这个“中间人” 😂

2、第一次修改-只有代理模式


修改之后的UML图如下:

代理类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:04
 * 代理类
 */
public class Proxy {
    private ObjectGirl girl;
    public Proxy(ObjectGirl girl) {
        this.girl = girl;
    }
    public void giveFlowers() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的花。");
    }
    public void giveChocolate() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的巧克力。");
    }
    public void giveDolls() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的洋娃娃。");
    }
}


客户端:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:09
 */
public class ProxyTest {
    public static void main(String[] args) {
        ObjectGirl xiaohong = new ObjectGirl();
        xiaohong.setGirlName("小红");
        Pursuit xiaohua = new Pursuit(xiaohong);
        xiaohua.giveDolls();
        xiaohua.giveFlowers();
        xiaohua.giveChocolate();
    }
}


观察发现,只有代理人了,就相当于是小华直接向小红进行表白了,就把小明忽略掉了

3、 符合实际的代码

UML类图

接口:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:21
 */
public interface GiveGift {
    void giveDolls();
    void giveFlowers();
    void giveChocolate();
}


代理:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:04
 * 代理类
 */
public class Proxy implements GiveGift {
    private Pursuit pursuit; //认识追求者
    public Proxy(ObjectGirl girl) { // 也认识被追求者
        this.pursuit = new Pursuit(girl); // 代理初始化,实际就是追求者初始化过程
    }
    public void giveFlowers() { // 代理者向被追求者松礼物
        this.pursuit.giveFlowers();
    }
    public void giveChocolate() {
        this.pursuit.giveChocolate();
    }
    public void giveDolls() {
        this.pursuit.giveDolls();
    }
}



追求者:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:04
 * 追求者
 */
public class Pursuit implements GiveGift{
    private ObjectGirl girl;
    public Pursuit(ObjectGirl girl) {
        this.girl = girl;
    }
    public void giveFlowers() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的花。");
    }
    public void giveChocolate() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的巧克力。");
    }
    public void giveDolls() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的洋娃娃。");
    }
}



被追求者同上。

最后的结果都是一样的:

4、代理模式


代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在代理模式中,一个类代表另一个类或一些类的功能。这种类型的设计模式属于结构型模式。代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。


在代理模式中,通常会涉及到三个角色:抽象主题角色、真实主题角色和代理主题角色。


抽象主题角色声明了真实主题角色和代理主题角色的公共方法

真实主题角色实现了抽象主题角色定义的接口,代表着真实的业务实现

代理主题角色持有真实主题角色的引用,可以访问真实主题角色,同时还可以在真实主题角色基础上添加一些附加的操作

代理模式有两种不同的实现方式:静态代理和动态代理。在静态代理中,代理类在编译期间就已经确定,并且只能代理特定的接口或者类;在动态代理中,代理类是在运行时动态生成的,可以代理任意接口或者类。


代理模式的优点:


职责清晰

高扩展性

智能化

代理模式可以控制对对象的访问,从而实现一些安全性或者监控的功能。


在使用代理模式时,需要注意的是,代理类和被代理类通常应该共同实现一个接口或者继承自同一个父类,并且需要仔细考虑代理类的生命周期和线程安全性等问题。

4.1 代理模式结构图

ISubject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。

ISubject类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:35
 * 代理类和真实类都要实现的接口
 */
public interface ISubject {
    void request();
}


RealSubject类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:36
 * 真实的实体类
 */
public class RealSubject  implements ISubject {
    @Override
    public void request() {
        System.out.println("RealSubject do something");
    }
}


代理类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:36
 * 代理类:代理真实类完成一些列的操作
 */
public class Proxy implements ISubject {
    private RealSubject rs; // 拥有真实类的属性
    public Proxy() {
        this.rs = new RealSubject(); // 代理初始化,也就是真实类的初始化过程
    }
    // 代理类要做的事情
    public void request() {
        this.rs.request();
    }
}


客户端:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:39
 */
public class Test {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request(); // 通过代理发送给RealSubject类 // RealSubject do something
    }
}



5、 代理模式应用


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

虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象

安全代理,用来控制真实对象访问时的权限

智能指引,是指当调用真实的对象时,代理处理另外一些事

ng[] args) {

Proxy proxy = new Proxy();

proxy.request(); // 通过代理发送给RealSubject类 // RealSubject do something

}

}


## 5、 代理模式应用
1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
3. 安全代理,用来控制真实对象访问时的权限
4. 智能指引,是指当调用真实的对象时,代理处理另外一些事


目录
相关文章
|
2月前
|
设计模式 缓存 安全
设计模式——代理模式
静态代理、JDK动态代理、Cglib 代理
设计模式——代理模式
|
2月前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
|
3月前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
3月前
|
设计模式
设计模式的基础问题之代理模式在工作中的问题如何解决
设计模式的基础问题之代理模式在工作中的问题如何解决
|
4月前
|
设计模式 算法 Go
iLogtail设计模式问题之代理模式在iLogtail中是如何应用的
iLogtail设计模式问题之代理模式在iLogtail中是如何应用的
|
4月前
|
设计模式 缓存 JavaScript
js设计模式【详解】—— 代理模式
js设计模式【详解】—— 代理模式
32 0
|
5月前
|
设计模式 监控 安全
设计模式之代理模式(Java)
设计模式之代理模式(Java)
|
5月前
|
设计模式 安全 Java
Java设计模式:代理模式的静态和动态之分(八)
Java设计模式:代理模式的静态和动态之分(八)
|
5月前
|
设计模式 Java
Java设计模式之代理模式详解
Java设计模式之代理模式详解
|
5月前
|
设计模式
代理模式-大话设计模式
代理模式-大话设计模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78