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方法,并在方法里面通过方法名判断,需要增强的方法。