您的位置:首页 > 编程语言 > Java开发

java设计模式(6) - 装饰设计模式

2015-08-06 20:56 465 查看
概述:在不改动类的原代码的情况下,对类的功能进行加强。
使用场景:当一个类的功能不够用时,可以写个子类去继承这个类,
然后能过构造方法把父类传进来。
重写父类方法。如下边的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);
  }
 
 }
 
 
 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  装饰设计模式