被代理角色实现抽象主题角色,专注实现被代理角色的业务逻辑。继续看代理角色:

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研发岗的面试经历,分享下我的复习笔记面经

中高级Java开发面试高频考点题笔记300道.pdf

记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经

架构进阶面试专题及架构学习笔记脑图

记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经

Java架构进阶学习视频分享