被代理角色实现抽象主题角色,专注实现被代理角色的业务逻辑。继续看代理角色:
public class Agent implements Subject {
private Subject star;
public Agent(Subject star) {
this.star = star;
}
@Override
public void movie() {
System.out.println(getClass().getSimpleName() + ":剧本很好,这部电影接下了");
star.movie();
}
}
代理角色持有被代理角色的引用,**要访问被代理角色必须通过代理**,负责被代理角色本职之外的职能,并且具有准入和过滤的功能。最后来看客户端的实现:
public class Client {
public static void main(String[] args) {
Subject star = new Star();
Subject proxy = new Agent(star);
proxy.movie();
}
}
表面上是调用了代理的方法,实际的执行者其实是被代理角色Star,看看结果就知道:
> Agent:剧本很好,这部电影接下了
> Star:经纪人接了一部电影,我负责拍就好
上面是代理模式其中的一种实现方式,主要在代理角色Agent中指定了被代理角色Star,意思是经纪人大喊一声“嘿~兄弟,你是我的了!”。
下面看代理模式的另一种实现方式,先看抽象主题角色代码:
public interface Subject {
public void movie();
// 指定代理
public Subject getAgent();
}
增加了指定代理的方法getAgent,再来看被代理角色和代理角色代码:
// 被代理角色
public class Star implements Subject {br/>@Override
public void movie() {
System.out.println(getClass().getSimpleName() + ":经纪人接了一部电影,我负责拍就好");
}
@Override
public Subject getAgent() {
return new Agent(this);
}
}
// 代理角色
public class Agent implements Subject {
private Subject star;
public Agent(Subject star) {
this.star = star;
}
@Override
public void movie() {
System.out.println(getClass().getSimpleName() + ":剧本题材很好,这部电影接下了");
star.movie();
}
@Override
public Subject getAgent() {
return this;
}
}
重点看被代理角色getAgent方法,方法里面指定了Agent为代理,而Agent的getAgent并没有指定代理。下面看客户端代码实现:
public class Client {
public static void main(String[] args) {
Subject star = new Star();
Subject proxy = star.getAgent();
proxy.movie();
}
}
在客户端通过getAgent得到指定代理角色,由代理来控制star对象。
运行的结果的跟上一种方式是一样的。注意,这种方式是客户端直接访问被代理角色,代理由被代理角色指定。前面的一种方式则是客户端不能访问直接访问被代理角色,只能访问代理。但是,**无论是哪一种方式,代理模式的实现都是必须经过代理才能访问被代理模式**。就比如明星拍电影,不会跳过经纪人直接找到明星,而是经过经纪人再到明星,要不然经纪人这个职位岂不是浪费了。
三、代理模式扩展
--------
### 代理模式VS装饰者模式
代理模式在讲解了,接下来看装饰者模式,先搞一张装饰者模式的UML图
![装饰模式UML图](https://s2.51cto.com/images/20210918/1631911043995537.jpg)
装饰模式UML图
别坑我读的书少,这明明就是代理模式的UML。没错,装饰者模式和代理模式就是这么相似,包括UML和代码实现,甚至可以是一模一样。不信?来看装饰者模式的代码,这里我只给出简单代码:
// 抽象构件
public interface Component {
public void movie();
}
// 具体构件,实现Component,要被装饰的
public class Star implements Component {br/>@Override
public void movie() {
System.out.println(getClass().getSimpleName() + ":化了妆迷倒一片妹纸,拍起来电影特别带劲");
学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,读者朋友可以转发分享下!
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】
Java核心知识体系笔记.pdf
中高级Java开发面试高频考点题笔记300道.pdf
架构进阶面试专题及架构学习笔记脑图
Java架构进阶学习视频分享
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/162375.html