前言
模版模式和策略模式在日常开发中经常遇到,这两个设计模式有啥区别,这里简单总结下。
模版模式简单demo
// 抽象模板类
abstract class AbstractClass {
// 模板方法定义了算法的骨架
public void templateMethod() {
// 执行固定的步骤
step1();
step2();
step3();
}
// 抽象方法,由子类实现具体的步骤
protected abstract void step1();
protected abstract void step2();
// 钩子方法,由子类选择性地实现具体的步骤
protected void step3() {
// 默认实现
}
}
// 具体模板类
class ConcreteClass extends AbstractClass {
protected void step1() {
System.out.println("执行步骤1");
}
protected void step2() {
System.out.println("执行步骤2");
}
protected void step3() {
System.out.println("执行步骤3");
}
}
// 客户端代码
public class TemplatePatternExample {
public static void main(String[] args) {
AbstractClass template = new ConcreteClass();
template.templateMethod();
}
}
上述例子中,抽象类AbstractClass定义了算法的骨架,通过templateMethod方法控制算法的整体流程,每个具体的步骤由抽象方法和钩子方法定义。具体子类ConcreteClass根据需要实现具体的步骤。客户端通过创建具体子类的实例并调用templateMethod方法来使用模板模式。
策略模式简单demo
// 定义一个接口,表示可互换的算法
interface Strategy {
void execute();
}
// 实现具体的算法
class ConcreteStrategy1 implements Strategy {
public void execute() {
System.out.println("执行策略1");
}
}
// 实现具体的算法
class ConcreteStrategy2 implements Strategy {
public void execute() {
System.out.println("执行策略2");
}
}
// 客户端代码
public class StrategyPatternExample {
public static void main(String[] args) {
// 根据需要选择具体的策略
Strategy strategy = new ConcreteStrategy1();
// 执行策略
strategy.execute();
// 切换到另一个策略
strategy = new ConcreteStrategy2();
// 执行策略
strategy.execute();
}
}
上述例子中,定义了一个表示可互换的算法的接口Strategy,并实现了两个具体的策略类ConcreteStrategy1和ConcreteStrategy2。客户端根据需要选择并使用不同的策略。通过创建具体策略类的实例并调用execute方法来使用策略模式。
总结
模板模式(Template Pattern)和策略模式(Strategy Pattern)是两种常用的设计模式,它们在解决不同的问题上有一些区别。
- 模板模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板模式通过在父类中定义算法的骨架然后使用抽象方法暴露可变部分,使得子类可以根据自身需求实现具体的步骤。这种方式可以确保算法的结构不变,但允许特定步骤的自定义实现。
- 策略模式也是一种行为设计模式,它定义了一组可以相互替换的算法,并使得这些算法可以独立于使用算法的客户而变化。策略模式将每个算法封装在不同的类中,并允许客户端根据需要选择要使用的算法。这种方式将算法的选择和使用与具体算法的实现分离开来,提供了更高的灵活性和可扩展性。
总结来说,模板模式侧重于使用继承来实现算法的骨架,并允许子类实现具体的步骤,而策略模式侧重于使用组合来选择和使用不同的算法实现。模板模式在父类中定义了算法的骨架,子类只负责实现具体的步骤,而策略模式将算法的选择和使用完全交给了客户端。