JAVA静态代理
eg:
- 抽象出一个动作,比如:吃晚餐
public interface DoSomeThing {
void eatDinner();
}
- 作为一个人,我们要实现吃晚餐的这个动作,so
public class DoSomeThingImpl implements DoSomeThing{
@Override
public void eatDinner() {
System.out.println("开始吃晚餐");
}
}
- 我们受过教育,被通知饭前要洗手(业务中突然需要新增逻辑),我们可以修改eatDinner()的逻辑,但我们也可以使用代理,吃饭前使用代理类进行新增或修改某一步操作
public class DoSomeThingProy implements DoSomeThing{
private DoSomeThingImpl doSomeThing;
//传入之前的对象,原来该做的事还是要做
public DoSomeThingProy(DoSomeThingImpl doSomeThing) {
this.doSomeThing = doSomeThing;
}
@Override
public void eatDinner() {
//在吃晚饭前要先洗手
System.out.println("洗手");
doSomeThing.eatDinner();
//todo 也可以在吃完饭后漱个口
//xxxxx.xxxxx();
}
}
- 测试
public class DoSomeThingTest {
public static void main(String[] args) {
DoSomeThingImpl doSomeThing=new DoSomeThingImpl();
DoSomeThingProy doSomeThingProy=new DoSomeThingProy(doSomeThing);
doSomeThingProy.eatDinner();
}
}
输出:
洗手
开始吃晚餐
没有修改原代码,通过一个代理类,在原来的动作之前或者之后都可以进行新增其他新的动作
- 优点:静态代理模式在不改变目标对象的前提下,实现了对目标对象的功能扩展。
- 缺点:静态代理实现了目标对象的所有方法,一旦目标接口增加方法,代理对象和目标对象都要进行相应的修改,增加维护成本。