目的
为实际访问的对象增加控制能力
例子代码
最近获奖小学生火了, C10orf67 在结直肠癌发生发展中的功能与机制研究, 这标题他都没看懂拿去参赛获奖了.
还有近期厦大和天大的同学毕业论文大部分段落重复的问题, 还有之前的校长气功治疗癌症争议, 不禁让人感慨, 少年强则国强, 少年假则国假, 希望以后学术氛围会越来越好.
我们定义一个 Owner 接口代表论文的编写人:
public interface Owner { String writePaper(String condition);}
真实写论文的人:
public class RealOwner implements Owner { @Override public String writePaper(String condition) { return condition + "参赛文章: <C10orf67 在结直肠癌发生发展中的功能与机制研究>"; }}
我们拿着去参加博士生的比赛:
Owner owner = new RealOwner();System.out.println(owner.writePaper("博士大赛"));
输出:
博士大赛参赛文章: <C10orf67 在结直肠癌发生发展中的功能与机制研究>
问题分析
不是呀, 我是给我儿子去参加小学生竞赛的, 怎么参加了博士大赛, 我这个 RealOwner 类的方法需要我儿子来代理访问
代理模式
所以我们让小学生代理我们去参赛, 不是小学生的比赛不参加
public class ProxyOwner implements Owner { private Owner myFather = new RealOwner(); @Override public String writePaper(String condition) { if (Objects.equals("云南小学生大赛", "")) { return myFather.writePaper(condition); } return "不好意思, 不是小学生比赛不参加"; } private class RealOwner implements Owner { @Override public String writePaper(String condition) { return condition + "参赛文章: <C10orf67 在结直肠癌发生发展中的功能与机制研究>"; } }}
这样就是让客户端在使用的时候确保不是小学生的比赛不参加了
Owner owner = new ProxyOwner();System.out.println(owner.writePaper("博士大赛"));
输出:
不好意思, 不是小学生比赛不参加
类图:
课后作业
1. 了解并编写动态代理 demo
2. 对外开放一个 User queryUserInfo(String userId) 接口, 使用 Spring 自定义注解用来实现简单水平鉴权能力, userId 与登录的 userId 没有上下级关系则不允许访问