疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

浅谈JAVA中“增强”类的某个方法的几个中方法!


 

   

  一、继承

  使用场景:能够控制这个类的构造的时候,才可以使用继承。

  优点:简单容易使用,

  缺点:耦合性大大的增强,不利于后期的维护,所以对于继承这种方法,谨慎使用。

  代码实现:

  二、装饰者模式

  使用场景:1、包装对象和被包装对象实现相同的接口

  2、包装的对象中需要获得到被包装对象的引用。

  缺点:如果接口的方法比较多,增强其中某个方法,其他的功能的方法需要原有的调用;

  代码实现:

  /**

  * 装饰者模式:

  * 增强request的getParameter方法,使其编码格式为utf-8

  */

  public class MyServletRequest extends HttpServletRequestWrapper{

  private HttpServletRequest request;

  public MyServletRequest (HttpServletRequest request) {

  super(request);

  this.request=request;

  }

  @Override //重写getParameter方法

  public String getParameter(String name) {

  String value = request.getParameter(name);

  try {

  value=new String(value.getBytes("iso-8859-1"),"utf-8");

  } catch (UnsupportedEncodingException e) {

  throw new RuntimeException(e);

  }

  return value;

  }

  三、动态代理

  使用场景:被增强的对象实现InvocationHandler 接口。

  需求:(1)定义一个服务员接口

  // 服务员

  public interface Waiter {

  // 服务

  public void serve();

  }

  (2)一个男服务员的类并实现服务员接口。男服务员有个方法是服务。

  public class ManWaiter implements Waiter {

  public void serve() {

  System.out.println("服务中...");

  }

  }

  现在想让男服务员在服务的时候有礼貌,需要在服务的方法前后加上礼貌用语。

  动态代理实现代码:

  public class Demo {

  @Test

  public void fun1() {

  Waiter manWaiter = new ManWaiter();//目标对象

  /*

  * 给出三个参数,来创建方法,得到代理对象

  */

  ClassLoader loader = this.getClass().getClassLoader();

  Class[] interfaces = {Waiter.class};

  InvocationHandler h = new WaiterInvocationHandler(manWaiter);//参数manWaiter表示目标对象

  // 得到代理对象,代理对象就是在目标对象的基础上进行了增强的对象!

  Waiter waiterProxy = (Waiter)Proxy.newProxyInstance(loader, interfaces, h); //获取ManWaiter增强后的对象

  waiterProxy.serve(); //在这里执行WaiterInvocationHandler 中的invoke方法

  }

  }

  //定义一个类实现InvocationHandler 这就是增强的类

  public class WaiterInvocationHandler implements InvocationHandler {

  private Waiter waiter;//目标对象

  public WaiterInvocationHandler(Waiter waiter) {

  this.waiter = waiter;

  }

  public Object invoke(Object proxy, Method method, Object[] args)

  throws Throwable {

  System.out.println("您好!");

  this.waiter.serve();//调用目标对象的目标方法

  System.out.println("再见!");

  return null;

  }

  }