大话设计模式十五:模板模式

一.模式定义

模板方法模式(Template Method Pattern):定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法是一种类行为型模式
Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. 

 

二.模式要素

模板方法模式包含如下角色:
AbstractClass: 抽象类 
ConcreteClass: 具体子类

 

三.举例说明

我觉得没必要上UML图了,因为太简单了。实际就是一个抽象类与具体类的继承关系图。模板就是一个半成品,子类固定继承其中的一部分实现,其他的定制化实现则在子类中。

所有的动物都必须喝水,喝水这个方法的具体实现对所有动物都适用,可以在抽象类中直接实现,子类只需要继承即可。吃东西这个方法可以在父类中声明为抽象方法,具体的子类再去重写自己的吃方法。比如狼要吃肉,羊要吃草。此外如果有需要还可以在子类中加自己的特定方法。

 

四.具体代码

Animal.java  抽象动物

package templatePattern;

/**
 * 描述:
 * 动物抽象类
 *
 * @author Lei Dong
 * @create 2019-04-29 15:15
 */
public abstract class Animal {
    public String name;

    public Animal(String name) {
        this.name = name;
    }

    protected Animal() {
    }

    void drink() {
        System.out.println("喝水");
    }

    abstract void eat();
}

Wolf.java  狼

package templatePattern;

/**
 * 描述:
 * Wolf
 *
 * @author Lei Dong
 * @create 2019-04-29 15:17
 */
public class Wolf extends Animal {
    public Wolf() {
        name = "狼";
    }

    @Override
    void drink() {
        super.drink();
    }

    @Override
    void eat() {
        System.out.println("吃肉");
    }
}

Sheep.java  羊

package templatePattern;

/**
 * 描述:
 * 羊
 *
 * @author Lei Dong
 * @create 2019-04-29 15:18
 */
public class Sheep extends Animal {
    public Sheep() {
        name = "羊";
    }

    @Override
    void drink() {
        super.drink();
    }

    @Override
    void eat() {
        System.out.println("吃草");
    }
}

Main.java

package templatePattern;

/**
 * 描述:
 * Main
 *
 * @author Lei Dong
 * @create 2019-04-29 15:15
 */
public class Main {
    public static void main(String[] args) {
        Animal sheep = new Sheep();
        System.out.println(sheep.name + ":");
        sheep.drink();
        sheep.eat();

        Animal wolf = new Wolf();
        System.out.println(wolf.name + ":");
        wolf.drink();
        wolf.eat();
    }
}

运行结果:

大话设计模式十五:模板模式_第1张图片

 

五.总结

1.模板模式的优点

(1)模板方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理。
(2)模板方法模式是一种代码复用的基本技术。
(3)模板方法模式导致一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”。

2.模板模式的缺点

(1)每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以提高。

3.模式适用场景

在以下情况下可以使用模板方法模式:
(1)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
(2)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
(3)对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。
(4)控制子类的扩展。

你可能感兴趣的:(设计模式)