模板方法模式是一种类的行为型模式,用于定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,其缺点是对于不同的实现,都需要定义一个子类,这会导致类得个数增加,但是更加符合类职责的分配原则,使得类得内聚性得以提高。
优点:代码重用的基础技术
使用场景:
1)想要一次实现算法的不变部分,而使用子类实现算法的可变行为。
2)当子类间的通用行为需要分解、定位到通用类的时候,这样可以避免代码重复的问题。
Template Method
public abstract class Document { /// <summary> /// 存储文档数据 /// </summary> public void Save() { Console.WriteLine("存储文档数据"); } /// <summary> /// 打开文档 /// </summary> /// <param name="docName"></param> public void Open(string docName) { Console.WriteLine("打开文档"); } /// <summary> /// 关闭文档 /// </summary> public void Close() { Console.WriteLine("关闭文档"); } public abstract void Read(string docName);//抽象方法读取文档 }
public abstract class Application { private IList<Document> docs = new List<Document>();//文档对象列表 /// <summary> /// 判断是否可以打开指定文档 /// </summary> /// <param name="docName"></param> /// <returns>返回true时表示可以打开;返回false时表示不可打开</returns> public bool CanOpenDocument(string docName) { return true; } public void AddDocument(Document aDocument) { docs.Add(aDocument);//将文档对象添加到文档对象集合当中 Console.WriteLine("加入了aDocument对象"); } public abstract Document DoCreateDocument();//抽象方法 创建一个文档对象 /// <summary> /// 打开指定文档 /// </summary> /// <param name="docName">文档路径</param> public void OpenDocument(string docName) { if (!CanOpenDocument(docName)) { Console.WriteLine("文档无法打开!"); return; } Document adoc = DoCreateDocument(); adoc.Open(docName); adoc.Read(docName); AddDocument(adoc); } }