理解:代理类proxy和被代理的类A实现同一个接口,代理类proxy的实现方法中调用A的实现方法,但是可以在调用A方法的前后加一些其它逻辑。使用时,直接调用代理类的方法。
使用场景:当类A的方法不能满足需求时,即我们想在类A方法执行的前后做一些额外的事情时使用。
下面用一个被告请代理律师的例子,代码实现。
1、首先定义一个打官司的接口
/**
* date: 2022-03-28
* 打官司接口
*/
public interface Lawsuit {
//陈述内容
void saySomething();
}
2、定义一个被告类
/**
* date: 2022-03-28
* 被告
*/
public class Defendant implements Lawsuit{
@Override
public void saySomething() {
System.out.println("被告:陈述自己没有犯罪的事实");
}
}
3、定义代理律师类
/**
* date: 2022-03-28
* 代理律师
*/
public class ProxyLawyer implements Lawsuit{
private Defendant defendant;
public ProxyLawyer(Defendant defendant) {
this.defendant = defendant;
}
@Override
public void saySomething() {
System.out.println("律师:提交证据");
System.out.println("律师:阐述事实");
defendant.saySomething();
System.out.println("律师:无罪辩护");
}
}
测试
public class TestMain {
public static void main(String[] args) {
Defendant defendant = new Defendant();
Lawsuit proxy = new ProxyLawyer(defendant);
proxy.saySomething();
}
}
输出结果
律师:提交证据
律师:阐述事实
被告:陈述自己没有犯罪的事实
律师:无罪辩护
总结:个人理解,代理模式最核心的思想就是在被代理对象方法执行的前后加入一些额外的逻辑。至于代码实现为什么非要实现同一个接口,我觉得就是个规范,换成实现抽象类的抽象方法也一样。