首页 » 语言&开发 » Java » 源码中的设计模式之策略模式和模板方法模式

源码中的设计模式之策略模式和模板方法模式

 

策略模式和模板方法模式,允许我们拥有一些通用的代码,

这些代码可能来自代码库或者框架,然后对另一些用以执行特定任务的代码起到代理作用。

用TinyWeb源码,加以说明

策略模式

RenderingStrategy类负责完成策略的实际工作的接口,由用户自己去实现。


public interface RenderingStrategy { public String renderView(Map<String, List<String>> model); }

//View接口,定义抽象 public interface View { public String render(Map<String, List<String>> model); } /** * 创建实际的视图 * 并没有做特别的操作,只是捕获了具体策略的异常而已 **/ public class StrategyView implements View { private RenderingStrategy viewRenderer; //传递具体的策略 public StrategyView(RenderingStrategy viewRenderer) { this.viewRenderer = viewRenderer; } @Override public String render(Map<String, List<String>> model) { try { //具体策略的执行 return viewRenderer.renderView(model); } catch (Exception e) { throw new RenderingException(e); } } } //继承RenderingStrategy接口,实现需要的策略方法,传递 //给StrategyView。就能实现相应的策略模式。

模板方法模式


/** * 定义一个只有一个方法的接口 **/ public interface Controller { public HttpResponse handleRequest(HttpRequest httpRequest); }

/** * 定义一个抽象 **/ public abstract class TemplateController implements Controller { private View view; public TemplateController(View view) { //接收一个策略而已,对模板方法没影响 this.view = view; } public HttpResponse handleRequest(HttpRequest request) { Integer responseCode = 200; String responseBody = ""; try { Map<String, List<String>> model = doRequest(request); //传递一个策略模式,处理相应的策略 responseBody = view.render(model); } catch (ControllerException e) { responseCode = e.getStatusCode(); } catch (RenderingException e) { responseCode = 500; responseBody = "Exception while rendering."; } catch (Exception e) { responseCode = 500; } return HttpResponse.Builder.newBuilder().body(responseBody) .responseCode(responseCode).build(); } //具体需要实现的方法 protected abstract Map<String, List<String>> doRequest(HttpRequest request); //子类需要继承该模板方法 }
  • 模板方法模式主要是采用继承的方式来完成相应的工作

  • 策略模式主要是通过组合来完成相应的工作,对象的组合



原文链接:源码中的设计模式之策略模式和模板方法模式,转载请注明来源!

0