zoukankan      html  css  js  c++  java
  • 理解Java方法增强

    在实际开发中,我们往往需要对某些方法进行增强,常用的方法增强的方式有三种。

    • 类继承 、方法覆盖
      必须控制对象创建,才能使用该方式

    • 装饰者模式方法加强
      必须和目标对象实现相同接口或继续相同父类,特殊构造器(传入被包装对象)

    • 动态代理

    我们来编写一个案例感受一下,新建一个Java项目。
    新建类Cat

    public class Cat{
    	public void run(){
    		System.out.println("喵喵~一只猫在奔跑");
    	}
    }
    

    现在若想对该类的run()方法进行增强,第一种方法,利用类继承,方法覆盖。
    编写测试代码

    @Test
    public void demo1(){
    	//方法增强的第一种途径,利用类的继承以及方法覆盖
    	Cat cat = new Cat(){//匿名内部类
    		@Override
    		public void run() {
    			//保持方法原有的功能
    			super.run();
    			//新增该方法功能
    			System.out.println("抓到一只老鼠");
    		}
    	};
    	cat.run();
    }
    

    运行测试代码
    在这里插入图片描述
    方法成功被增强了。
    该种增强方法的方式必须控制对象的创建。

    那么第二种增强方式就是装饰者模式,但是请注意,使用该方式增强方法是有前提的,就是必须与原对象去实现相同的接口或者继承相同的类。
    演示一下。
    新建一个接口ICat

    interface ICat{
    	public void run();
    }
    

    然后新建一个装饰者CatFilter

    //装饰者
    class CatFilter implements ICat{
    	
    	private ICat cat;//cat就是被包装的对象
    	//实现目标对象相同的接口
    	
    	//特殊的构造方法
    	
    	public CatFilter(ICat cat){
    		this.cat = cat;
    	}
    
    	public void run() {
    		//原有方法功能
    		cat.run();
    		//新增方法功能
    		System.out.println("又抓住一只老鼠");
    	}
    }
    
    

    编写测试代码

    @Test
    public void demo2(){
    	//第二种	装饰者模式	前提:必须与原对象去实现相同的接口或者继承相同的类
    	ICat cat = new CatFilter(new Cat());
    	cat.run();
    }
    

    在这里插入图片描述
    方法被成功增强。

    第三种增强方式就是动态代理,也是Java中进行方法增强最常用的方式。
    原理:根据原对象在内存中构造一个代理对象,而原对象的所有方法都将去执行代理对象的invoke方法。
    演示一下。
    编写测试代码

    @Test
    public void demo3(){
    	final ICat cat = new Cat();//原对象
    	ICat catProxy = (ICat) Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new InvocationHandler() {
    			
    		public Object invoke(Object proxy, Method method, Object[] objs)
    				throws Throwable {
    			//增强run方法
    			if(method.getName().equals("run")){
    				method.invoke(cat,objs);//调用原对象的方法,保留原方法的功能
    				//新增功能
    				System.out.println("抓住第三只老鼠");
    			}
    			return null;
    		}
    	});
    	catProxy.run();
    }
    

    运行测试代码
    在这里插入图片描述
    方法被成功增强。
    以上便是Java方法增强的三种方式。

  • 相关阅读:
    HDU 3572 Task Schedule(拆点+最大流dinic)
    POJ 1236 Network of Schools(Tarjan缩点)
    HDU 3605 Escape(状压+最大流)
    HDU 1166 敌兵布阵(分块)
    Leetcode 223 Rectangle Area
    Leetcode 219 Contains Duplicate II STL
    Leetcode 36 Valid Sudoku
    Leetcode 88 Merge Sorted Array STL
    Leetcode 160 Intersection of Two Linked Lists 单向链表
    Leetcode 111 Minimum Depth of Binary Tree 二叉树
  • 原文地址:https://www.cnblogs.com/blizzawang/p/11411362.html
Copyright © 2011-2022 走看看