方法增强的三种模式

来源:互联网 发布:在淘宝网怎么做兼职 编辑:程序博客网 时间:2024/06/05 15:37

动态 代理、装饰及内部类:

package e.cn.itcast.enhance;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import org.junit.Test;public class MethodEnhanceTest { // 动态 代理 : dynamic proxy @Testpublic void test3(){// 真实的 业务 对象 ,final ICat cat = new Cat(); // 用于 返回  一个真实 业务对象的 一个 代理对象 ,这个代理对象  就可以 对 这个 被代理的真实 对象 的 方法 进行 加强 ICat proxyCat = (ICat) Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {//如果要加强 if(method.getName().equals("run")){System.out.println(" 小黑 又 跑的 比 刘翔 还块了. 不得了 ..."); return method.invoke(cat, args);}// 如果 对方法 进行 加强  ,// 这样写 表示 调用 原有的 逻辑 return method.invoke(cat, args);}});  proxyCat.run();}/* * 第二种 :使用包装 对 java类的 方法 进行 加强  , 怎么 弄 ? *  *   包装 : 装饰者  ...  *    *   1. 装饰者 与 被装饰者 要实现 同样的 接口 .  *      2. 在装饰者 装饰 被装饰者 对象时, 需要 将 被装饰者 传递给  装饰者 . , 可以通过构造函数  *       *    *  */@Testpublic void test2(){DecratorCat cat = new DecratorCat(new Cat());cat.run();}@Testpublic void test1(){//匿名 内部类  :  我需要 new 对象 . 就要用到 构造函数 .Cat cat = new Cat(){@Overridepublic void run() {// TODO Auto-generated method stub//super.run();System.out.println("小黑 奔跑的 真 TMD 块 ");}};cat.run();}}//  被装饰者 class Cat implements ICat{public void run(){System.out.println("小黑 在黑暗中 抓住 了 一只 老鼠 ...");}}interface ICat{public void run();}class DecratorCat implements ICat{private ICat cat;public DecratorCat(ICat cat) {this.cat = cat;}@Overridepublic void run() {cat.run();System.out.println("小黑 奔跑 速度 达到 了 25 m 每秒  ....");}}



0 0