longshu

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

TemplateMethod 模板方法模式

  • 模板方法模式:
    定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
    模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。

模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。
通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,
在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,
从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

  • 示例类图:
    TemplateMethod_uml

  • 示例代码:

// AbstractClass
public abstract class Game {
    protected abstract void initialize();

    protected abstract void startPlay();

    protected abstract void endPlay();

    // template method
    public final void play() {
        initialize();// initialize the game
        startPlay();// start game
        endPlay();// end game
    }
}

// ConcreteClass
public class Cricket extends Game {
    @Override
    protected void endPlay() {
        System.out.println("Cricket Game Finished!");
    }

    @Override
    protected void initialize() {
        System.out.println("Cricket Game Initialized! Start playing.");
    }

    @Override
    protected void startPlay() {
        System.out.println("Cricket Game Started. Enjoy the game!");
    }
}
// ConcreteClass
public class Football extends Game {
    @Override
    protected void endPlay() {
        System.out.println("Football Game Finished!");
    }

    @Override
    protected void initialize() {
        System.out.println("Football Game Initialized! Start playing.");
    }

    @Override
    protected void startPlay() {
        System.out.println("Football Game Started. Enjoy the game!");
    }
}

// 测试
public class TemplateTest {

    public static void main(String[] args) {
        Game game = new Cricket();
        game.play();

        game = new Football();
        game.play();
    }
}
  1. AbstractClass
    是一个抽象类,其实也就是一个抽象模版,定义并实现一个模版的方法。
    这个模版的方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,
    而逻辑组成步骤在相应的抽象操作中,推迟到子类实现。
    顶级逻辑也有可能调用一些具体方法。

  2. ConcreteClass
    实现夫类所定义的一个或者多个抽象方法。每一个AbstractClass
    都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass
    都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

模版方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。
我们通过模版方法模式把这些行为版已到单一的地方,这样就帮助子类摆脱重复的不变的行为的纠缠。

posted on 2016-12-28 18:23  longshu  阅读(107)  评论(0编辑  收藏  举报