黑马程序员技术交流社区

标题: 浅谈JAVA中“增强”类的某个方法的几个中方法! [打印本页]

作者: 叽叽咂咂    时间: 2017-9-20 14:04
标题: 浅谈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;  
        }  
    }





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2