设计模式之代理模式

    xiaoxiao2025-03-03  36

    代理模式

    代理模式 Proxy Pattern 代理模式属于GoF23种设计模式之一,是结构型模式的一种。 代理模式是为一个真实的对象提供一个代理从而通过代理控制对这个真实对象的访问的设计模式。 简单的理解代理模式,就是理解代理两个字,何为代理,就是为自己找一个代理人,比如明星有着自己的经纪人,被告原告有着自己的律师,亦或是总经理级别的,董事长级别的大佬们有着自己的秘书,等等,都是代理的现实体现。

    代理模式的组成

    代理模式分为了三个角色:

    抽象角色:一个接口或者抽象类,声明的是真实对象需要实现的方法。真实对象角色:实现了抽象角色并且实现了自己需要实现的功能,用以提供给代理调用。代理:实现了抽象角色并含有一个真实对象角色的引用,是真实对象角色的代理,通过对真实对象的业务逻辑有条件性的控制来实际处理的逻辑。

    代理模式的特点

    代理模式最为重要的就是在客户和真实对象之间有着一种类似于中介的作用,对真实对象进行了很大的保护作用。 而对于真实对象来说也就不需要关心其他,只需要实现好自己的功能即可。

    来个小案例

    情景:娱乐行业的发展在现今是极为迅猛的,五花八门的各种电影,电视剧,综艺节目充斥在我们的周围,很多很多的人都有着自己心目中的IDOL,每个明星都有着自己的特殊技巧在娱乐业中发光,每位明星都有着自己的经纪人或者是自己的团队,对于各种邀约,商家们首先需要找的不是明星本人而是她的经纪人们洽谈,但是最后需要实际作用的还是明星自己本人呢! 于是我们就可以开始编写我们的小栗子啦!

    对于情景中的各个角色进行定位分配 抽象角色:明星自身会的功能抽象集合,案例中为Abilities接口。 真实对象:明星,案例中为IDOL类。 代理:经纪人,案例中为Agent类。来一张UML类图梳理关系 抽象接口角色的定义 /** * 代理模式案例 * 抽象角色 接口的定义部分 * @author WQ */ public interface Abilities { void sing(); void dance(); void rap(); } 真实对象角色的定义 /** * 代理模式案例 * 真实对象角色 IDOL类实现部分 * @author WQ */ public class IDOL implements Abilities{ @Override public void sing() { System.out.println("唱歌!"); } @Override public void dance() { System.out.println("跳舞!"); } @Override public void rap() { System.out.println("Rap 饶舌!"); } } 代理的定义 /** * 代理模式案例 * 代理 经纪人类实现部分 * @author WQ */ public class Agent implements Abilities{ private IDOL idol; private float money; /* * 通过字段money来对唱歌,跳舞,rao进行控制! * 到了一定的金额才有相应的功能会被触发! */ @Override public void sing() { if (money >= 20000){ idol.sing(); }else { System.out.println("钱不够,本家IDOL不提供唱歌服务!"); } } @Override public void dance() { if (money >= 80000){ idol.dance(); }else { System.out.println("钱不够,本家IDOL不提供跳舞服务!"); } } @Override public void rap() { if (money >= 100000){ idol.rap(); }else { System.out.println("钱不够,本家IDOL不提供rap服务!"); } } public float getMoney() { return money; } public void setMoney(float money) { this.money = money; } public Agent() { } public Agent(IDOL idol) { this.idol = idol; } public Agent(IDOL idol, float money) { this.idol = idol; this.money = money; } } 测试类的编写 /** * 代理模式案例 * 测试案例 客户端实现部分 * @author WQ */ public class Test { public static void main(String[] args){ // 真实对象 IDOL idol = new IDOL(); // 将真实对象提供给代理 Agent agent = new Agent(idol); //客户第一次出价为9K System.out.println("第一次测试:"); agent.setMoney(9000f); agent.sing(); agent.dance(); agent.rap(); //客户第二次出价为11W System.out.println("第二次测试:"); agent.setMoney(110000f); agent.sing(); agent.dance(); agent.rap(); } } 运行结果截图 代理模式的介绍就到这里啦!!! 上述的代理模式的实现方式也称为静态代理的实现模式,除了静态代理,还有JDK的动态代理和通过CGLIB的动态代理实现模式。 如果想要了解更多的话: JDK动态代理实现可以参考往期博客:小白第十三篇 JDK动态代理实现方式 CGLIB动态代理实现可以参考往期博客:小白第十四篇 CGLIB动态代理
    最新回复(0)