概述:在不改动类的原代码的情况下,对类的功能进行加强。
使用场景:当一个类的功能不够用时,可以写个子类去继承这个类, 然后能过构造方法把父类传进来。
重写父类方法。如下边的CharacterEncodingFilter 。
例1.
/**
* 鸭子类
* @author jiangwei
*
*/
public class YaZi {
public void execute() {
System.out.println("我会游泳");
}
}
=========================================
public class SuperYazi {
//1. 把鸭子定义成成员变量
private YaZi yazi;
public SuperYazi(YaZi yazi) {
//2.在yazi的构造方法中传入鸭子类
this.yazi = yazi;
}
public void execute() {
yazi.execute();
System.out.println("我会飞");
}
}
========================================
例2
public class CharacterEncodingFilter implements Filter{
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest(request);
chain.doFilter(requestWrapper, response);
}
public void destroy() {
}
}
class MyCharacterEncodingRequest extends HttpServletRequestWrapper{
public MyCharacterEncodingRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
private HttpServletRequest request;
@Override
public String getParameter(String name) {
try {
String value = this.request.getParameter(name);
if(value == null) {
return null;
}
if(!this.request.getMethod().equalsIgnoreCase("get")) {
return value;
}
value = new String(value.getBytes("ISO8859-1"), this.request.getCharacterEncoding());
return value;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}