Java增强原有方法的三种方式

1、第一种,也是最简单的一种,继承类,覆盖原有方法

Cat cat = new Cat(){
    @Override
	public void run(){
        //调用父类的run方法
		super.run();
		System.out.println("我是方法增强部分");
	}	
}

这个比较容易理解,而且我们也用的挺多的。但是用这个方法有一个前提,就是我们能控制类的创建。这种时候,才能这么做。比如工场模式就不能这样。

2、装饰者模式

这个比第一个复杂很多,这里我慢慢解释。

首先,假如我们还是要增强Cat的run方法。假设Cat实现一个ICat接口。这个时候我们需要一个装饰者来帮我们扩展方法。而且这个装饰者必须实现ICat接口。(实际运用中,装饰者必须与源对象实现相同接口或者继承相同父类)下面就是装饰者类的写法

class CatFilter implements ICat{
    //声明cat对象
    private ICat cat;
	
	public CatFilter(ICat cat){
		this.cat = cat;
	}

	public void run(){
	    cat.run();
	    System.out.println("这是方法增强部分");
	}	
}

在我们扩展方法时,就应该调用装饰者的run方法

ICat cat = new Cat();
CatFilter catFilter = new CatFilter(cat);
catFilter.run();

3、动态代理

这里就不细纠动态代理是啥了,一般写法都不会变

//创建Cat对象
ICat cat = new Cat();


ICat catProxy = Proxy.newProxyInstance(cat.getClass().getClassLoader,
                        			cat.getClass().getInterfaces(),
			 new InvocationHandler(){
				public Object invoke(Object proxy, Method method,
					Object[] args) throws Throwable{
					if(method.getName().eques("run")){
						method.invoke(cat, args);
						System.out.println("这是方法增强部分");
					}
					return null;	
				}
			});
catProxy.run();

这里就是调用Proxy.newProxyInstance()方法,传入三个参数。

第一个就是ClassLorder,第二个是对象的所有接口,第三个就是InvocationHandler。重写InvocationHandler中的invoke方法,并在方法里面通过方法名判断,需要增强的方法。

发布了33 篇原创文章 · 获赞 3623 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/ZackSock/article/details/96750711