
今天有人问我如何增强课程的功能. 博客恰好什么都没有,今天我将讨论增强功能.
共有三种增强方法:
1. 继承或实现接口: 其特点是不能更改增强对象java 扩展类,并且不能更改增强内容.
2. 装饰模式: 特征是增强对象是可变的,但是增强内容不是可变的.
3. 动态代理: 其特点是要增强的对象是可变的,增强的内容是可变的.

以下是增强对象的三种方法:
继承: AA类继承对象的类型: 类A,然后重写fun1()方法,其中重写的fun1()方法是增强方法. 但是,继承必须知道对象的真实类型,然后才能继承. 如果我们不知道对象的确切类型,而只知道该对象是IA接口的实现类对象,则不能使用继承来增强该对象;
Decorator模式: AA类实现一个对象的同一接口: IA接口,还需要将一个对象传递给AA类java 扩展类,然后该类中的所有方法都由代理对象的同一方法实现,只有fun1()方法在对象的代理相同方法之前和之后添加一些内容. 这是对fun1()方法的增强;
动态代理: 动态代理类似于装饰器模式,它是通过反射完成的.
详细说明:

1. 遗产. Java是一种面向对象的语言. 继承机制大大增强了其可扩展性. 我们可以通过继承扩展和增强现有的类. 子类继承父类后,可以获取父类的所有公共方法,并且子类可以执行重写和其他操作. 该方法简单易学,但是代码耦合大大增强,不利于以后的维护,因此请谨慎使用.
2. 装饰器设计模式. 设计模式是Java编程的重要组成部分. 具体来说,不仅是Java. 几乎所有高级编程语言都涉及编程模式. 当然,要完全了解设计模式,仅学习语言是不够的. 百度百科中的解释是: 在不更改原始文件和不使用继承的情况下,动态扩展对象的功能. 它是通过创建包装对象(即装饰)来包装实际对象. Java的IO流是标准的装饰器模式. 在这里,我们拿出两个Java类来解释InputStream和BufferedInputStream. 这两个类是字节输入流和字节缓冲输入流. 简而言之,缓冲区流是字节流的增强版本,使用的模式是装饰器模式,我们可以看到BufferedInputStream的构造函数中的BufferedInputStream(InputStream in)字节流是作为参数输入的,因此缓冲区流可以通过输入字节流对象传递. 调用字节流中的所有方法,而不会妨碍缓冲区流的私有方法,这是更经典的装饰器增强功能.
这里是一个例子来说明:
需求: 要处理GET请求参数的编码,当需要释放过滤器时,将对请求对象进行“调整”,即,目标Servlet在“调整包”之后使用请求对象. 这意味着我们需要确保“打包”之后的请求对象中的所有方法都必须像“打包”之前一样可用,并且getParameter()方法还必须能够在转码后返回参数. 这可能使您想起“继承”,但是您不能在这里使用继承,而只能使用“装饰器模式”!
解决方案: 增强请求对象的条件恰好符合装饰器模式的特征!因为我们不知道请求对象的具体类型,但是我们知道请求是HttpServletRequest接口的实现类. 这表明我们编写了一个EncodingRequest类来实现HttpServletRequest接口,然后将原始请求传递给EncodingRequest类!在EncodingRequest中,HttpServletRequest接口中的所有方法都是通过代理原始请求对象实现的,只有增强的代码才添加到getParameter()方法中!

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(面向方面的编程),它与装饰器模式有点相似,它比装饰器模式更灵活!

这里是一个例子来说明:
要求: (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
还好输了