设计模式-模版方法设计模式

62 阅读2分钟

模版设计模式是一种行为设计模式,它在父类中定义了基本的算法骨架,而实际的操作步骤延迟到子类去实现。

模版方法设计模式有以下的好处

  • 它可以提高代码的复用率,重复或者相近的处理逻辑放在父类中,避免了重复的代码。
  • 它可以提高代码的扩展性,将不同的处理逻辑或者特殊逻辑放到子类中,通过对子类的扩展增加新的行为.

举个简单的例子

比如去学校这个动作,我们可以抽象成三个步骤:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings):


	
// 抽象类,定义了模板方法和基本方法
public abstract class AbstractStudent {
    // 模板方法,定义了准备去学校的流程
    public final void prepareGotoSchool() {
        dressUp();
        eatBreakfast();
        takeThings();
    }

    // 基本方法,由子类实现
    protected abstract void dressUp();
    protected abstract void eatBreakfast();
    protected abstract void takeThings();
}

// 具体子类,实现了基本方法
public class StudentA extends AbstractStudent {
    @Override
    protected void dressUp() {
        System.out.println("StudentA 穿校服");
    }

    @Override
    protected void eatBreakfast() {
        System.out.println("StudentA 吃面包和牛奶");
    }

    @Override
    protected void takeThings() {
        System.out.println("StudentA 带上书包和钥匙");
    }
}

public class StudentB extends AbstractStudent {
    @Override
    protected void dressUp() {
        System.out.println("StudentB 穿运动服");
    }

    @Override
    protected void eatBreakfast() {
        System.out.println("StudentB 吃饺子和豆浆");
    }

    @Override
    protected void takeThings() {
        System.out.println("StudentB 带上篮球和手机");
    }
}

// 测试类,创建不同的子类对象,调用模板方法
public class Test {
    public static void main(String[] args) {
        AbstractStudent studentA = new StudentA();
        studentA.prepareGotoSchool();
        System.out.println("--------------------");
        AbstractStudent studentB = new StudentB();
        studentB.prepareGotoSchool();
    }
}

这个例子比较简单,其实你还可以定义一个钩子,来让子类选择每个动作是否需要执行。

模版模式和策略模式的区别

  • 在实现方式上模版模式一般是通过抽象方法和实现类来实现,策略模式是通过接口和实现类来处理;
  • 模版方法在抽象类中定义了一个相对固定的算法,算发的步骤具体实现延迟到了子类去完成.而策略模式是定义了一组算法,并将每个算法封装成了一个对象.从而让他们可以相互替换;
  • 模版方法更强调的是流程和结构,而策略模式更强调的是灵活性和替换性;

原文链接