设计模式-模板方法模式

定义:在父类中定义处理流程的框架,在子类中实现具体的处理就成为模板方法模式(Template Method),

假设我们制定一个木偶的流程,我们想要一个做胖木偶的类,还有一个做瘦木偶的类,每个类的方法都差不多,只是具体的实现有所不同,这时我们就可以用模板方法模式,类图如下:

我们在AbstractPerson类中定义了制作玩偶的流程(在createPerson中去调用abstract方法head、body、arms、legs分别去创建玩偶的头、身体、胳膊、腿),而在子类中去做具体的实现,具体实现如下:

public abstract class AbstractPerson {

    protected String head;
    protected String body;
    protected String arms;
    protected String legs;

    abstract void head();
    abstract void body();
    abstract void arms();
    abstract void legs();

    final void createPerson(){
        head();
        body();
        arms();
        legs();
        System.out.println(head + "," + body + "," + arms + "," + legs + "创建成功!");
    }
}
public class FatPerson extends AbstractPerson {
    void head() {
        head = "大圆脸";
    }

    void body() {
        body = "大肚子";
    }

    void arms() {
        arms = "圆胳膊";
    }

    void legs() {
        legs = "大粗腿";
    }
}
public class ThinPerson extends AbstractPerson {
    void head() {
        head = "瓜子脸";
    }

    void body() {
        body = "A4腰";
    }

    void arms() {
        arms = "细胳膊";
    }

    void legs() {
        legs = "大长腿";
    }
}

如上所示,抽象类AbstractPerson类只负责具体的流程指定,而实现类FatPerson和ThinPerson分别对流程进行了具体的实现。

下面进行测试

public class Main {
    public static void main(String[] args){
        AbstractPerson fatPerson = new FatPerson();
        AbstractPerson thinPerson = new ThinPerson();
        fatPerson.createPerson();
        thinPerson.createPerson();

    }
}

结果

那么用模板方法的模式有什么好处呢?

1.  可以在抽象类中定义每个处理的节点,防止遗漏,如果自己实现,不小心某个类忘记了head方法就不好了。

2. 可以让子类只关心具体方法的实现,而不用管这些方法的调用顺序。如果有些方法一定要按照严格的顺序调用,用模板方法实现也是个不错的选择。

3. 调用时引用可以用抽象类,无论父类的对象中保存哪个子类的实例,程序都可以正常运行,这种原则称为里氏替换原则。

 

模板方法模式属于行为型设计模式,划分了责任和算法

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章