Template Method Pattern 模板方法模式

本文介绍了模版方法模式的概念、原理及应用,通过准备一个抽象类并将其部分逻辑实现为具体方法和构造子,同时声明抽象方法迫使子类实现剩余逻辑,展示了不同子类如何以不同方式实现这些抽象方法,实现算法的结构不变而逻辑可定制。文章深入探讨了好莱坞原则在模式中的体现,并强调了低级别组件如何与高层级组件交互而不受限制。

Template Method Pattern: defines the skeleton of an algorithm in a method, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.

准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模版方法模式的用意。

This pattern is all about creating a template for an algorithm. It;s a method that defines an algorithm as a set of steps. Some steps are concrete, some are abstract.

public abstract class Template {
	protected final void TemplateMethod() {
		primitiveMethod();
		concreteMethod();
		hook();
	}
	protected abstract void primitiveMethod1();
	protected final void concreteMethod() {
		//do something
	}
	protected hook() {}
}

A hook is a method that is declared in the abstract class, but only given an empty or default implementation. So subclass can either use the default method or override the hook method.

Design Principle:

Hollywood Principle: Don't call us, we'll call you.

Allow low-level components to hook themselves into a system, but the high-level components determine when they are needed, and how.

模板方法设计模式(Template Method Design Pattern)是一种行为型设计模式,用于定义算法的骨架,同时允许子类在不改变算法结构的情况下重新定义某些步骤。该模式通过将不变的部分封装在抽象基类中,并将可变部分延迟到子类中实现,从而实现了代码复用和扩展性。 ### UML 类图 以下是 `Template Method` 模式的典型 UML 类图结构: ``` +---------------------+ | AbstractClass | +---------------------+ | + templateMethod(): void | | # primitiveOperation1(): void | | # primitiveOperation2(): void | +---------------------+ ▲ | +---------------------+ | ConcreteClass | +---------------------+ | # primitiveOperation1(): void | | # primitiveOperation2(): void | +---------------------+ ``` - **AbstractClass**:定义了一个模板方法 `templateMethod()`,其中包含算法的整体流程,并调用若干原语操作(primitive operations)。这些原语操作通常被声明为受保护的抽象方法,由子类具体实现。 - **ConcreteClass**:继承自 `AbstractClass`,并实现了具体的原语操作。 ### 示例代码 以下是一个使用模板方法模式的 Java 实现示例,展示了如何定义一个算法框架并在子类中实现具体步骤: ```java // 抽象类,定义模板方法和原语操作 abstract class Game { abstract void initialize(); abstract void startPlay(); abstract void endPlay(); // 模板方法,定义游戏流程 public final void play() { initialize(); // 初始化游戏 startPlay(); // 开始游戏 endPlay(); // 结束游戏 } } // 具体类 - 足球游戏 class FootballGame extends Game { @Override void initialize() { System.out.println("Football Game Initialized! Start playing."); } @Override void startPlay() { System.out.println("Football Game Started. Enjoy the game!"); } @Override void endPlay() { System.out.println("Football Game Finished!"); } } // 测试类 public class TemplateMethodPatternDemo { public static void main(String[] args) { Game game = new FootballGame(); game.play(); // 调用模板方法 } } ``` 运行结果: ``` Football Game Initialized! Start playing. Football Game Started. Enjoy the game! Football Game Finished! ``` 上述代码展示了模板方法模式的核心思想:父类控制整体流程,子类实现具体细节[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值