`

Design Pattern: Template Method 模式

    博客分类:
  • J2SE
阅读更多

不要将设计模式想得高不可攀,好像高手才会使用的东西,事实上如果您在下手程式之前,能稍稍对程式作个分析规划,或多或少都会用到一些模式了,模式不是教条,它只是前人的经验成果,而 Gof 的书则是择前人之精华持续改进而来罢了。

Template Method模式就是一个很简单的模式,但可能是使用最广泛的模式,也许您也一直在使用这样的模式,看它的

仅仅是抽象类别与具体类别实作的关系而已,有些人常问抽象类别与介面的区别为何,Template Method模式可以提供其中一个答案,例如:

  • AbstractClass.java
public abstract class AbstractClass { 
    public void templateMethod() { 
        // step by step template to solve something 
        // implementor should follow those step 
        opStep1(); 
        opStep2(); 
        opStep3(); 
    } 

    public abstract void opStep1(); 
    public abstract void opStep2(); 
    public abstract void opStep3(); 
} 

 

  • ConcreteClass.java
public class ConcreteClass extends AbstractClass { 
    public abstract void opStep1() { 
        // implement the real operation 
    } 

    public abstract void opStep2() { 
        // implement the real operation 
    } 

    public abstract void opStep3() { 
        // implement the real operation 
    } 
}


对于一些程式而言,我们希望规定一些处理的步骤、流程或骨架,就像是上例中的step1到step3一样,至于流程中的step1到step3如何实作并不规定,而留给实作的人自行决定,这就是Template Method模式的目的。

抽象类别与介面的差别之一,也正在于抽象类别可以先实作其中一些方法,而介面则是完全仅规定接口,使用Template Method模式就可以看出两者之间在应用上的一个差别。

仅以step1到step3这样的操作来看Template Method模式,似乎彰显示不出其实作骨架,而将实作部份留待子类的实用性,在 Gof 书中所举的例子是与 Factory Method 模式结合的一个例子;通常开启一个档案的流程是相似的,例如文字档或二进位档,不外乎检查档案是否可开启、读取档案、设定显示等流程,可以使用 Template Method模式来规范这个流程: 

 public abstract class Application {
    // .....

    public void openDocument(String name) {
        // Template Method
        if(!canOpenDocument(name)) { // unable to open file
            // show error message, throw exception
            return;
        }

        Document doc = createDocument(); // Factory Method

        if(doc != null) {
            _docs.addDocument(doc);
            // Template Method
            aboutToOpenDocument(doc);
             doc.open();
             doc.doRead();
        }
    }

    // Factory Method
    public abstract Document createDocument();

    // Template Method
    public abstract boolean canOpenDocument(String name);
    public abstract void aboutToOpenDocument(Document doc);
 }
 
 public class MyApplication extends Application {
    // implement Factory Method
    public void Document createDocument() {
        return new MyDocument();
    }

    // implement Template Method
    public void boolean canOpenDocument(String name) {
        // implemented code here
    }

    public void aboutToOpenDocument(Document doc) {
        // implemented code here
    }
 }

 
Factyro Method模式将实际要创建的物件推迟至子类中决定,而 Template Method模式则是将流程框架的实作留待子类来解决,事实上在这个例子中,您也可以将createDocument()看作是Template Method模式中的一个方法,从物件创建的角度来看它是Factory Method,而从流程框架的角度来看,它则是Template Method模式的一个方法实作。

分享到:
评论

相关推荐

    DesignPattern:C#设计模式示例

    "DesignPattern:C#设计模式示例"这个资源很可能是包含多个C#实现的设计模式示例代码库。 设计模式通常分为三类:创建型、结构型和行为型。每种模式都解决了特定场景下的问题,并提供了良好的代码组织和扩展性。 ...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    DesignPattern::pencil:设计模式_java实现以及详解

    本资源“DesignPattern::pencil:设计模式_java实现以及详解”提供了一套详细的学习材料,帮助开发者理解和应用设计模式。 该资源的作者是“养码青年-Style”,他通过这个项目记录了自己的设计模式学习过程。鼓励...

    DesignPattern:设计模式小Demo

    设计模式是软件工程中的一种最佳实践,用于解决在软件设计中常见的...以上就是这个DesignPattern小Demo中可能会涵盖的设计模式,通过这些模式的实例,你可以更好地理解和应用它们到实际项目中,提升你的Java编程能力。

    designpattern:PHP设计模式教程

    本教程的"designpattern-master"可能包含以上各种设计模式的实例代码和详细解释,帮助学习者通过实践掌握这些模式。在实际项目中,灵活运用这些设计模式可以提高代码质量,使项目更加健壮和易于维护。对于PHP开发者...

    DesignPattern:设计模式

    DesignPattern-master这个压缩包可能包含了一个关于设计模式的项目或者教程资源。 设计模式分为三类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)...

    设计模式java源码-design-pattern:java设计模式源代码

    3. 行为型模式:这类模式定义了对象之间的通信和责任分配,包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、责任链模式(Chain of Responsibility)...

    FOAD-DesignPattern:FOAD-DesignPattern

    8. 模板方法模式(Template Method Pattern): 模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。在C#中,可以使用虚方法和...

    designPattern:设计模式相关代码实现

    "designPattern:设计模式相关代码实现"这个项目,显然提供了不同设计模式在Java语言中的实际应用示例。 在Java世界里,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。每种模式都针对特定的编程问题...

    设计模式源码Head_First_DesignPattern_src

    8. 模板方法模式(Template Method): 模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。`TemplateMethodExample`展示了如何通过定义模板方法来确保某些步骤的执行顺序,同时允许子类重写具体...

    design-pattern:标准设计模式的实施

    - 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。 在实际项目开发中,合理运用这些设计模式...

    DesignPattern:设计模式演示程序

    这个名为"DesignPattern"的压缩包文件很可能包含了一个Java实现的各种设计模式的示例程序。 在这个"DesignPattern-master"目录中,我们可以期待找到一系列与设计模式相关的Java源代码文件(.java),每个文件或...

    DesignPattern:设计模式.net源代码

    本资源"DesignPattern:设计模式.net源代码"提供了一套基于.NET实现的设计模式示例,旨在帮助程序员更好地理解和应用这些模式。 在"DesignPattern-master"这个压缩包中,你可能找到的文件结构和内容包括: 1. **...

    Design Pattern英文版

    设计模式(Design Pattern)是软件工程中的一种经验总结,它是在特定上下文中为解决常见问题而提出的一套可复用的解决方案。设计模式并不直接实现为代码,而是提供了一种在面向对象设计中如何处理常见问题的指南。...

    java源码解读-DesignPattern:Android源码设计模式解析与实战读书笔记源代码

    java 源码解读 DesignPattern Android源码设计模式解析与实战读书笔记...包名template_method_pattern表示的是外观模式的简单例子 包名state_pattern表示的是状态模式的简单例子 包名state_pattern.normal表示的是无状

    JAVA design pattern-java设计模式

    行为型模式关注对象之间的通信和责任分配,如命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、状态(State)、策略(Strategy)、模板...

    Head First Design Pattern

    3. 行为型设计模式:例如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态...

    design-pattern:研究设计模式

    "design-pattern-main"这个文件可能包含了关于设计模式的主要内容,包括但不限于对以上介绍的各个模式的详细解释、示例代码和应用实例。通过学习和理解这些设计模式,开发者能够更好地应对复杂软件系统的设计挑战,...

Global site tag (gtag.js) - Google Analytics