静态代理
代理:顾名思义就是类似于经纪人的角色,当某个导演要找某个演员拍戏的时候,往往会找到这个演员的经纪人(也许不很恰当,不了解饭圈的运作,例子也不是很恰当,当个故事听一听,便于理解),这个经纪人就是代理对象。大明星和经纪人都要实现person接口(共同的接口),经纪人(代理对象)要内部要包含大明星(被代理对象),就是一个简单的代理模式。
person接口
public interface Person {
// 表演方法
void perform(String str);
}
带明星类
public class WomenStar implements Person{
@Override
public void perform(String str) {
System.out.println("参演"+ str + "主角");
}
}
经纪人类
public class jingjiren implements Person {
// 要将大明星包进来
private Person person;
public jingjiren(Person person){
super();
this.person = person;
}
@Override
public void perform(String str) {
doSomeThingBefore();
person.perform(str);
doSomeThingAfter();
}
private void doSomeThingBefore(){
System.out.println("阅读剧本");
}
private void doSomeThingAfter(){
System.out.println("拿到报酬");
}
}
Main方法
public class Main {
public static void main(String[] args) {
Person person = new WomenStar();
jingjiren fp = new jingjiren(person);
fp.perform("女");
}
}
运行结果
动态代理
静态代理有个问题,如果某大导演是要找另一个明星拍戏,那么就要再找另一位经纪人,这违背了开闭原则(对扩展打开,对修改关闭)。所以我们要使用动态代理。
经纪人类
public class ProxyMai implements InvocationHandler {
private Object person;
public void setFactory(Person person){
this.person = person;
}
// 通过proxy获取动态代理的对象
public Object getProxyInstance(){
return Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this);
}
// 通过动态代理对象对方法进行增强
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doSomeThingBefore();
Object ret = method.invoke(person, args);
doSomeThingAfter();
return null;
}
private void doSomeThingBefore(){
System.out.println("阅读剧本");
}
private void doSomeThingAfter(){
System.out.println("拿到报酬");
}
}