策略模式和模板方法模式,允许我们拥有一些通用的代码,
这些代码可能来自代码库或者框架,然后对另一些用以执行特定任务的代码起到代理作用。
用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);
//子类需要继承该模板方法
}
模板方法模式主要是采用继承的方式来完成相应的工作
策略模式主要是通过组合来完成相应的工作,对象的组合
原文链接:源码中的设计模式之策略模式和模板方法模式,转载请注明来源!