模板方法 (Template Method )
模板方法模式是基于继承的代码复用基本技术,在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。
把公共的内容提取到模板中,只留下部分让用户来填写。在软件系统中,将多个类的共有内容提取到一个模板中的思想便是模板方法模式的思想。
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
结构图:
模板方法的本质:固定算法骨架
1.需要固定的算法骨架,实现一个公共部分,将可变的部分交给子类去实现;
2.各个子类中具有公共部分,应该抽取出来,集中在一个类中去实现,从而避免代码重复;
3.需要控制子类扩展情况,模板方法模式会在特定的点来调用子类的方法,这样只允许在这些点进行扩展;
简单例子:
模板类:
public abstract class TemplateMethod_Base
{
public string str;
//流程启动方法
public void StartFunction(string path)
{
str = decryption(ReadFile(path));
printText();
}
//读取文件
private byte[] ReadFile(string path)
{
return File.ReadAllBytes(path);
}
//解码方式模板方法
protected abstract string decryption(byte[] Data);
//打印文件内容
private void printText()
{
Debug.Log("文字为:" + str);
}
}
实现类:
//具体解码
public class Str_Utf8 : TemplateMethod_Base
{
protected override string decryption(byte[] Data)
{
return Encoding.UTF8.GetString(Data);
}
}
//具体解码
public class Str_Utf7 : TemplateMethod_Base
{
protected override string decryption(byte[] Data)
{
return Encoding.UTF7.GetString(Data);
}
}
运行测试:
// Use this for initialization
void Start()
{
TemplateMethod_Base templateMethod;
templateMethod = new Str_Utf8();
templateMethod.StartFunction(Application.streamingAssetsPath + "/WinInfo.json");
templateMethod = new Str_Utf7();
templateMethod.StartFunction(Application.streamingAssetsPath + "/WinInfo.json");
}
结果: