程序员接口
/**
* 程序员接口
*/
public interface Programmer {
void coding();
}
实现支付模块代码编写的程序员Zzq
/**
* Zzq程序员
*/
public class Zzq implements Programmer{
@Override
public void coding() {
System.out.println("Zzq编写支付模块的代码");
}
}
为Zzq点赞的程序员大V
/**
* 静态代理
*/
public class ProgrammerBigV implements Programmer {
private Zzq zzq;
public ProgrammerBigV(Zzq zzq) {
this.zzq = zzq;
}
public void upvote() {
System.out.println("程序员大V点个赞");
}
@Override
public void coding() {
zzq.coding();
upvote();
}
}
只为Zzq点赞的程序员大V1,还收费1元
/**
* 透明代理(普通代理)
*/
public class ProgrammerBigV1 implements Programmer{
private Zzq zzq;
public ProgrammerBigV1() {
this.zzq = new Zzq();
}
public void upvote() {
System.out.println("程序员大V1点个赞");
}
public void addMoney() {
System.out.println("程序员大V1点完赞收1元");
}
@Override
public void coding() {
zzq.coding();
upvote();
addMoney();
}
}
测试类
public class Test {
public static void main(String[] args) {
//为任意程序员进行点赞(静态代理)
// Zzq zzq = new Zzq();
// ProgrammerBigV programmerBigV = new ProgrammerBigV(zzq);
// programmerBigV.coding();
//只为程序员zzq进行点赞(透明代理)
// ProgrammerBigV1 programmerBigV1 = new ProgrammerBigV1();
// programmerBigV1.coding();
//请水军代理(动态代理)
Zzq zzq = new Zzq();
Programmer programmerWaterArmy = (Programmer) Proxy.newProxyInstance(zzq.getClass().getClassLoader(), zzq.getClass().getInterfaces(), (proxy, method, args1) -> {
//如果是调用coding方法,那么水军点赞
if (method.getName().equals("coding")) {
method.invoke(zzq, args1);
System.out.println("我是水军,我来点赞了");
} else {
//如果不是调用coding方法,那么调用原对象的方法
return method.invoke(zzq, args1);
}
return null;
});
programmerWaterArmy.coding();
}
}
学自:
因篇幅问题不能全部显示,请点此查看更多更全内容