小威要向诸佬学习呀

小威要向诸佬学习呀

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的模板方法模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
23种设计模式之模板方法模式(Template Method Pattern)-LMLPHP

以下正文开始
23种设计模式之模板方法模式(Template Method Pattern)-LMLPHP

模板方法模式是一种行为型设计模式,它定义了一个算法骨架,将某些算法步骤的实现延迟到子类中。这样可以使得算法的框架不被修改,但是具体的实现可以根据需要进行调整。

在模板方法模式中,我们通常会定义一个抽象类,它包含了一个模板方法和一些抽象方法,这些抽象方法通常由子类来实现。具体过程如下:

定义抽象类(Abstract Class):抽象类中定义了一些抽象方法和一个模板方法。抽象方法通常是一些具体步骤,而模板方法则定义了算法的大致流程。由于抽象类中的某些方法需要由子类来实现,因此它们往往是 protected 访问权限。

定义具体子类(Concrete Class):具体子类继承自抽象类,并实现其中的抽象方法。在具体子类中,我们可以针对需要实现的具体步骤编写相应的代码。

下面使用一个简单的例子来介绍下模板方法模式:

假设我们要实现一个对一个数组进行排序的程序,我们可以定义一个抽象类 ArraySorter,其中包含一个模板方法 sort,这个方法包含以下步骤:检查数组是否为空、确定排序算法、调用具体的排序算法。我们可以将其中一步 “调用具体的排序算法” 延迟到子类中具体实现。在具体子类中,我们可以实现具体的排序算法,如快排、冒泡排序、插入排序等。

具体代码如下:

abstract class ArraySorter {
    public final void sort(int[] array) {
        if (array == null || array.length == 0) {
            return;
        }

        selectAlgorithm();
        sortArray(array);
    }

    protected abstract void selectAlgorithm();

    protected abstract void sortArray(int[] array);
}

class BubbleSorter extends ArraySorter {
    protected void selectAlgorithm() {
        System.out.println("Bubble sorting algorithm selected.");
    }

    protected void sortArray(int[] array) {
        // 具体的冒泡排序算法实现
    }
}

class QuickSorter extends ArraySorter {
    protected void selectAlgorithm() {
        System.out.println("Quick sorting algorithm selected.");
    }

    protected void sortArray(int[] array) {
        // 具体的快排算法实现
    }
}

在这个例子中,我们定义了一个抽象类 ArraySorter,其中包含一个模板方法 sort。在具体子类中,我们分别实现了 BubbleSorter 和 QuickSorter,重写了父类的 selectAlgorithm 和 sortArray 方法。

当需要对数组进行排序时,只需要创建一个具体的子类,并调用 sort 方法即可。例如:

int[] array = {...};
ArraySorter sorter = new BubbleSorter();
sorter.sort(array);

这样,就可以将算法的公共部分放在抽象类中实现,避免了大量的重复代码,并且能够根据需要灵活地选择不同的排序算法。

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
23种设计模式之模板方法模式(Template Method Pattern)-LMLPHP

23种设计模式之模板方法模式(Template Method Pattern)-LMLPHP

05-31 17:27