一、继承

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

 优点:简单容易使用,

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

  代码实现:

二、装饰者模式

 使用场景: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;  
        }  
    }

浅谈JAVA中“增强”类的某个方法的几个中方法!的更多相关文章

  1. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  2. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  3. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  4. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  5. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

  6. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  7. 浅谈Java中的final关键字

    浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  8. 【转】浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  9. 浅谈Java中的栈和堆

    人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数 ...

随机推荐

  1. java微信公众平台开发

    微信公众平台的开发,总体说来也是简单的,就是先大概看下微信公众平台接口文档. 请先大概浏览一下API手册,我们会发现,推送给微信服务器的数据有两种:xml的形式,和json的形式. 那么什么时候是XM ...

  2. github+hexo搭建自己的博客网站(二)更换主题yilia

    开始更换主题,hexo默认的主题是landscape,可以更换为其他的主题yilia主题 详细的可以查看hexo博客的演示:saucxs.github.io 可以查看在github上生成的静态文件:h ...

  3. 【MySQL】 清除等待连接

    由于MySQL突然新增了很多连接,超出了my.cnf所设置的最大连接数,MySQL服务无法访问,这里通过Shell脚本来删掉Sleep连接 方式1 清除连接进程 #!/bin/bash #------ ...

  4. 【2016北京集训测试赛(二)】 thr (树形DP)

    Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...

  5. 【2016北京集训测试赛(八)】 crash的数列 (思考题)

    Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...

  6. C/C++ 对优先级与结合性的理解

    优先级与结合性是指运算符与操作数的"紧密程度":   结合性表明了同一优先级的运算符对同一操作数的紧密程度:   如: a=b=c: 赋值运算符的结合性为从右至左: 所以a=b=c ...

  7. 转每天一个linux命令(5):rm 命令

    昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...

  8. multisim页面设置

    options—sheet properties 页面右键—properties

  9. Java入门(2) —— 变量详解、运算符、定义类和定义方法以及方法的调用

    1.变量 1.定义变量 1.声明的同时直接赋值 数据类型 变量名 = 值; 2.先声明,后赋值 声明: 数据类型 变量名; 赋值: 变量名 = 值; 2.数据类型 基本数据类型:4类8种 整数 --- ...

  10. 迈向angularjs2系列(7):表单

    目录 一:校验表单的使用 1.搭建脚手架 2.校验表单的使用 3.select下拉列表的用法 一: 校验表单的使用 对于CRUD型的应用,表单是必备组件. 1.搭建脚手架 git clone http ...