上接:代理模式
介绍
Java代理分为:
- 静态代理
- 动态代理
- JDK动态代理
- cglib代理
例子图解
静态代理
结构
- 目标接口:通过接口或抽象类声明业务方法。
- 目标类:实现目标接口,实现具体业务
- 代理(Proxy)类:内部有 目标类对象,实现目标接口,实现具体业务,并可以访问、控制或扩展 目标类 的功能。
优点:
在 不改变目标类 的情况下,实现了扩展。
缺点:
代理类实现目标接口,一旦 目标接口增加方法,代理类 要进行相应的修改,增加维护成本。
例子
定义 演员 接口
public interface IActor {
public boolean deal(int money,int days);
}
定义 演员类
public class Actor implements IActor{
public boolean deal(int money, int days) {
System.out.println(String.format("Actor==收到合约,酬劳:%s万,合约期:%s天",money,days));
System.out.println("Actor==演戏");
return true;
}
}
定义 经纪人类(代理类)
public class Agent implements IActor{
private IActor actor;
public Agent (IActor actor){
this.actor=actor;
}
public boolean deal(int money, int days) {
//代理类可以在目标对象的方法之前,增加额外的代码
if( money/days<1){
System.out.println("Agent==每天酬劳低于1万,不合作!");
return false;
}
System.out.println(String.format("Agent==经纪人扣30%%劳务费:%s,实付70%%给演员",money*3/10));
//代理类可以修改传入目标对象的参数,返回值
actor.deal(money*7/10,days);
//代理类可以在目标对象的方法之后,增加额外的代码
System.out.println("Agent==合作愉快,期待下次合作!");
return true;
}
}
说明:
- 在 目标类方法的前面,增加额外代码:
- 当日薪小于1万时,就拒拍
- 当日薪大于1万时,就接拍
- 修改传入参数
- 可以决定 是否调用 目标类方法
- 可以 修改返回值
- 可以在 目标类方法的后面,增加额外代码
在不改变 目标类 的情况下,增加额外的代码
定义 导演类(主启动类)
public class Director {
public static void main(String[] args) {
IActor actor=new Actor();
IActor agent=new Agent(actor);
// int money=350;
int money=280;
int days=300;
System.out.println(String.format("Director==谈合作:%s万,%s天,可以吗?",money,days));
boolean b=agent.deal(money,days);
if(b) {
System.out.println("Director==开拍");
}else{
System.out.println("Director==演员没谈成,不能开拍");
}
}
}
JDK动态代理
设计模式-代理模式-JDK动态代理(Proxy.newProxyInstance)
