模板方法(Template Method)设计模式
模板方法模式定义如下:
Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
即定义一个操作中算法的骨架,而降一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。
模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。
模板方法模式是结构最最简单的行为型设计模式。在其结构中只存在父类和子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。
模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。
其UML类图如下:
如上类图可知,模板方法包含如下:
1.AbstractClass:该类是一个abstract类,里面有一个模板方法(Template Method),用于定义一个算法的框架。模板方法不仅可以调用该抽象类中实现的基本方法,也可以是该类中的抽象方法(该抽象方法由其子类根据具体业务逻辑而不同实现),当然还可以调用其他对象中的方法。
2.ConcreteClass(具体子类):抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
具体实例
项目中使用template mthod模式的地方很多,现以项目中的一个具体例子来讲解。
例如:Android开发中,一般都是通过http请求返回json串,然后解析json串成对应的实体来展现。而为了网络传输的安全,我们一般需要对请求返回的json字符串进行加密,然后再进行解密,最后在进行解析。而不管返回哪种实体类对应的字符串,解密方法和过程是一样,而具体的解析实体类过程不一样,这是就可以使用模板方法模式。
public abstract class BaseJsonAnalysis {
// 需要解密标示
private String NEED_DECRYE = "1";
//模板方法
public <T> T parseRawJson(String rawJsonData){
rawJsonData = decrypt(rawJsonData);
return (T)paresJson(rawJsonData);
}
//返回解密后字符串
public String decrypt(String rawJsonData) {
if (!TextUtils.isEmpty(rawJsonData)) {
try {
String dataStr = rawJsonData;
JSONObject mContent = new JSONObject(dataStr);
String encrypt = mContent.optString("encrypt");
if (!TextUtils.isEmpty(encrypt)) {
dataStr = mContent.optString("data");
if(NEED_DECRYE.equals(encrypt)) {
dataStr = Utils.dataDecrypt(dataStr);
}
}
return dataStr;
}catch (Exception e) {
e.printStackTrace();
}
}
return rawJsonData;
}
//具体怎么解析;由具体子类实现;
protected abstract <T> T paresJson(String JsonData);
}
public class UserAnalysis extends BaseJsonAnalysis{
@Override
public User paresJson (String JsonData) {
if(!TextUtils.isEmpty(JsonData)) {
//........
//进行具体的解析;
return user;
}
return null;
}
}
注意:
为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。