设计模式-代理模式之多级动态代理

更多精彩内容请关注

  • 微信公众号:LifeSmile
  • 个人网站:www.lifesmile.cn

本文要实现一个:螳螂捕蝉黄雀在后这样一个逻辑。简单的说就是,蝉在吃树叶的时候,螳螂把蝉捕了,螳螂捕蝉的时候被黄雀阴了。

本文以JDK自带模式实现,Cglib方式可以自己下来尝试,至于JDK和Cglib实现方式有什么区别可以自己Google。简单的说一个是反射一个是修改字节码。

1.什么是代理设计模式

简单的理解就是中介,每个房东要出租房租,都要经历出租前的看房,看完房后签订合同。那么带人看房和合同签订直接交给中介完成。房东只需要做的是告诉中介我有套房租需要出租。

2.代理模式应用场景

SpringAOP、事物原理、日志打印、权限控制、远程调用、安全代理 可以隐蔽真实角色

3.代码实现多级代理

public interface BaseService {
    void eat();
}

//定义一个蝉,实现eat方法
public class Chan implements BaseService {
    public void eat() {
        System.out.println("蝉吃树叶");
    }
}


//定义蝉的代理对象
public class TangLang implements InvocationHandler {
    Object object;
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(object, args);
        System.out.println("螳螂捕蝉");
        return null;
    }
    public TangLang(Object chan) {
        this.object = chan;
    }
}

//定义螳螂的一个代理对象,也就是二级代理
public class HuangQue implements InvocationHandler {
    Object object;
    public HuangQue(Object o){
            this.object = o;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(object, args);
        System.out.println("黄雀在后");
        return null;
    }
}

//下面洗个工具类,用于获取代理对象
public class ProxyFactory {
    public static BaseService newInstance(Class classFiles) throws IllegalAccessException, InstantiationException {
        Object chan = classFiles.newInstance();//创建一个真实的蝉
        InvocationHandler tangLang = new TangLang(chan); // 创建代理实现类螳螂
        Class<?>[] interfaces = {BaseService.class};
        //获取代理对象,监听蝉何时吃树枝,当吃树枝就通知螳螂
        Object proxy1 = Proxy.newProxyInstance(classFiles.getClassLoader(), interfaces, tangLang);
        //创建代理实现类黄雀
        InvocationHandler huangque = new HuangQue(proxy1);
        
        BaseService proxy2 =(BaseService) Proxy.newProxyInstance(classFiles.getClassLoader(), interfaces, huangque);
        return proxy2;
    }
}

//测试类
public class Test {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        BaseService baseService = ProxyFactory.newInstance(Chan.class);
        baseService.eat();
    }
}

结果:
蝉吃树叶
螳螂捕蝉
黄雀在后

你可能感兴趣的:(设计模式,Java)