静态代理注意:真实对象和代理对象都要实现同一接口(意思是你直接创建的接口,真实和代理都要实现接口),代理对象里面必须要有真实角色(要“面向接口编程”,有target变量在“代理实现接口类之中”。
静态代理的好处:1——代理对象可以实现很多真实对象做不了的事情
2——真实对象只需要做自己的事情
以下为代码案例说明(简易的模仿结婚模式):
3.1 创建一个你要实现“功能”的接口,里面写上你需要实现的功能方法
interface Marry{ void HappyMarry(); }
3.2创建一个“真实对象”类去实现这个"功能"接口,快捷键alt+enter能快速创建这个类的执行体,打印语句代表真实角色执行逻辑
//真实角色,你去结婚 class You implements Marry{ @Override public void HappyMarry() { System.out.println("要结婚了,超开心"); } }
3.3创建一个“代理角色”类实现这个“功能”接口,alt+enter快捷键实现接口的方法执行体
class WeddingCompany implements Marry{ @Override public void HappyMarry() { } }
3.4在“代理角色”类之中创建“真实角色”,alt+enter快捷键实现“真实角色”的构造方法,并在“代理角色”类的执行体中进行逻辑编程
//代理角色,帮助你去结婚 class WeddingCompany implements Marry{ //代理谁-->真实目标角色 private Marry target; public WeddingCompany(Marry target) { this.target = target; } @Override public void HappyMarry() { before(); this.target.HappyMarry(); //这就是真实对象 after(); } private void after() { System.out.println("结婚之后,收取尾款"); } private void before() { System.out.println("结婚之前,布置现场"); } }
3.5 创建主类并利用lamda表达式结合“类似Runnable”接口的表达去写逻辑
public class StaticProxy { public static void main(String[] args) { //用线程去实现真实对象专注做自己的事情 new Thread(() -> System.out.println("我爱你")).start(); //()->为lamda简化 // WeddingCompany weddingCompany = new WeddingCompany(new You()); // weddingCompany.HappyMarry(); //这个是上面两行的简化,用了"类似Runnable"接口的表达去写逻辑 new WeddingCompany(new You()).HappyMarry(); } }
结果分析:
很明显的结果就是每次第一次执行都是主类先执行,然后执行”代理角色”帮忙的动作,由此我们可以知道,静态代理可以让“真实角色”被解放出来,可以很多,同时代码的编写也是“面向接口编程”,简化不少。