一:涉及角色:
抽象模版(Abstract Template):
1、定义一个 or 多个抽象(方法),给子类实现,
2、定义实现一个模板方法,调用(1) 中定义的抽象方法,作为 代码逻辑骨架(即操作步骤),子类中实现那些抽象方法,做相应的具体实现,
具体类(Concrete Class):实现 [抽象模版] 中的抽象方法,
二、使用 策略模式
1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。
最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3.控制子类扩展。
三、故事说明
看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method),但每个步骤针对不同的情况、不同人,都有不一样的做法,这就要看你随机应变啦(具体实现);
模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。
//抽象模版(Abstract Template):
public abstract class AbstractClass {
public abstract void doWrite();
public abstract void doSend();
public void sentMail(){
doWrite();
doSend();
}
}
具体类(Concrete Class)A:
public class ConcreteClassA extends AbstractClass {
@Override
public void doWrite() {
System.out.println("A写信……");
}
@Override
public void doSend() {
System.out.println("A发信……");
}
}
具体类(Concrete Class)B:
public class ConcreteClassB extends AbstractClass {
@Override
public void doWrite() {
System.out.println("B写信……");
}
@Override
public void doSend() {
System.out.println("B发信……");
}
}
客户端调用
public static void main(String[] args) {
ConcreteClassA classA = new ConcreteClassA();
classA.sentMail();
ConcreteClassB classB = new ConcreteClassB();
classB.sentMail();
}