几种增强Java类的方法

电脑杂谈  发布时间:2020-06-30 20:13:43  来源:网络整理

java一个类调用另一个类的方法_java代理类_java 扩展类

今天有人问我如何增强课程的功能. 博客恰好什么都没有,今天我将讨论增强功能.

共有三种增强方法:

1. 继承或实现接口: 其特点是不能更改增强对象java 扩展类,并且不能更改增强内容.

2. 装饰模式: 特征是增强对象是可变的,但是增强内容不是可变的.

3. 动态代理: 其特点是要增强的对象是可变的,增强的内容是可变的.

java 扩展类_java一个类调用另一个类的方法_java代理类

以下是增强对象的三种方法:

继承: AA类继承对象的类型: 类A,然后重写fun1()方法,其中重写的fun1()方法是增强方法. 但是,继承必须知道对象的真实类型,然后才能继承. 如果我们不知道对象的确切类型,而只知道该对象是IA接口的实现类对象,则不能使用继承来增强该对象;

Decorator模式: AA类实现一个对象的同一接口: IA接口,还需要将一个对象传递给AA类java 扩展类,然后该类中的所有方法都由代理对象的同一方法实现,只有fun1()方法在对象的代理相同方法之前和之后添加一些内容. 这是对fun1()方法的增强;

动态代理: 动态代理类似于装饰器模式,它是通过反射完成的.

详细说明:

java 扩展类_java一个类调用另一个类的方法_java代理类

1. 遗产. Java是一种面向对象的语言. 继承机制大大增强了其可扩展性. 我们可以通过继承扩展和增强现有的类. 子类继承父类后,可以获取父类的所有公共方法,并且子类可以执行重写和其他操作. 该方法简单易学,但是代码耦合大大增强,不利于以后的维护,因此请谨慎使用.

2. 装饰器设计模式. 设计模式是Java编程的重要组成部分. 具体来说,不仅是Java. 几乎所有高级编程语言都涉及编程模式. 当然,要完全了解设计模式,仅学习语言是不够的. 百度百科中的解释是: 在不更改原始文件和不使用继承的情况下,动态扩展对象的功能. 它是通过创建包装对象(即装饰)来包装实际对象. Java的IO流是标准的装饰器模式. 在这里,我们拿出两个Java类来解释InputStream和BufferedInputStream. 这两个类是字节输入流和字节缓冲输入流. 简而言之,缓冲区流是字节流的增强版本,使用的模式是装饰器模式,我们可以看到BufferedInputStream的构造函数中的BufferedInputStream(InputStream in)字节流是作为参数输入的,因此缓冲区流可以通过输入字节流对象传递. 调用字节流中的所有方法,而不会妨碍缓冲区流的私有方法,这是更经典的装饰器增强功能.

这里是一个例子来说明:

需求: 要处理GET请求参数的编码,当需要释放过滤器时,将对请求对象进行“调整”,即,目标Servlet在“调整包”之后使用请求对象. 这意味着我们需要确保“打包”之后的请求对象中的所有方法都必须像“打包”之前一样可用,并且getParameter()方法还必须能够在转码后返回参数. 这可能使您想起“继承”,但是您不能在这里使用继承,而只能使用“装饰器模式”!

解决方案: 增强请求对象的条件恰好符合装饰器模式的特征!因为我们不知道请求对象的具体类型,但是我们知道请求是HttpServletRequest接口的实现类. 这表明我们编写了一个EncodingRequest类来实现HttpServletRequest接口,然后将原始请求传递给EncodingRequest类!在EncodingRequest中,HttpServletRequest接口中的所有方法都是通过代理原始请求对象实现的,只有增强的代码才添加到getParameter()方法中!

java 扩展类_java代理类_java一个类调用另一个类的方法

JavaEE为我们提供了HttpServletRequestWrapper类,它是HttpServletRequest的包装器类,但是它没有做任何增强!您可能会说,写一个装饰性的类,但是不增强它,它的目的是什么?使用此装饰物和使用原始请求有什么区别?尽管HttpServletRequestWrapper类是HttpServletRequest的装饰类,但它不是直接使用的,而是供我们继承的!当我们想编写一个装饰类时,实现所有不需要增强的方法很烦人,但是如果继承HttpServletRequestWrapper类,则只需要重写需要增强的方法即可.

EncodingRequest代码:

    /** 
     * <p>类名称 EncodingRequest </p> 
    * <p>类描述  装饰者模式: 
    *           增强request的getParameter方法,使其编码格式为utf-8 
    * </p> 
    * @author   裴健 
    * @date     2017年3月22日 下午1:53:06 
     */  
    public class EncodingRequest extends HttpServletRequestWrapper{  
          
        private HttpServletRequest request;  
        public EncodingRequest(HttpServletRequest request) {  
            super(request);  
            this.request=request;  
        }  
          
        @Override  
        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;  
        }  
          
    }  

这里是增强get请求的请求对象的getParameter()方法,并将“ iso-8859-1”的编码直接更改为“ utf-8”的编码.

3. 代理模式,代理类模式比装饰器设计模式更难理解,因为这涉及反射原理. 学习代理模式最终是学习AOP(面向方面​​的编程),它与装饰器模式有点相似,它比装饰器模式更灵活!

java一个类调用另一个类的方法_java代理类_java 扩展类

这里是一个例子来说明:

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

// 服务员  
public interface Waiter {  
    // 服务  
    public void serve();  
} 

(2)男性服务员类和实现服务员接口. 酒保的一种方式就是服务.

    public class ManWaiter implements Waiter {  
        public void serve() {  
            System.out.println("服务中...");  
        }  
    }  

现在,我希望服务员在招待时要彬彬有礼,您需要在服务方法前后添加礼貌用语. 这时,我会考虑修改代码来实现. 如果您想在每次增强方法时都修改源代码,以外行的话来说,它似乎太低了. 这里我们需要动态代理来增强这个“服务员”.

解决方案代码:


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shouji/article-263928-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...