兩種語言實現設計模式(C++和Java)(二十:模板模式)
很久之前的設計模式系列漏掉了模板模式,現補上
概述
模板模式是一種行為型設計模式,它定義一個算法的骨架,并允許子類在不改變算法結構的情況下重新定義算法的某些步驟。模板模式的主要目的是通過把不變的行為搬移到超類,去除子類中的重復代碼來體現它的優勢。
模板模式的主要結構包括:
-
抽象類(Abstract Class):定義了一個算法的骨架,它的模板方法定義了算法的基本步驟,可以包含一個或多個抽象操作,子類通過實現這些抽象操作來完成具體的子步驟。
-
具體類(Concrete Class):實現抽象類中的抽象操作,以完成算法中與特定子類相關的步驟。
模板模式的優點:
-
提高代碼復用性:將相同部分的代碼放在抽象的父類中,而將不同的代碼放入不同的子類中。
-
實現了反向控制:通過一個父類調用其子類的操作,通過對子類的擴展增加新的行為,符合"開閉原則"。
-
提高了代碼的可讀性:將公共部分的代碼抽取出來,更容易理解。
模板模式的應用場景:
-
一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現。
-
各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復。
-
控制子類擴展,模板方法只在特定點調用"hook"操作,這樣就只允許在這些點進行擴展。
總之,模板模式通過把不變的行為搬移到超類,去除子類中的重復代碼來體現它的優勢。它提供了一個很好的代碼復用平臺,在類庫設計中尤為重要,可以提高代碼的復用性和可維護性。
UML

C++ 實現
#include <iostream>
// 抽象類:手機
class Phone {
public:
virtual ~Phone()
// 模板方法:定義手機的基本功能步驟
void usePhone() {
powerOn();
unlockScreen();
performSpecialFunction();
lockScreen();
powerOff();
}
protected:
// 抽象方法:開機
virtual void powerOn() = 0;
// 抽象方法:解鎖屏幕
virtual void unlockScreen() = 0;
// 抽象方法:執行特殊功能
virtual void performSpecialFunction() = 0;
// 抽象方法:鎖定屏幕
virtual void lockScreen() = 0;
// 抽象方法:關機
virtual void powerOff() = 0;
};
// 具體類:智能手機
class SmartPhone : public Phone {
protected:
void powerOn() override {
std::cout << "智能手機開機" << std::endl;
}
void unlockScreen() override {
std::cout << "智能手機解鎖屏幕" << std::endl;
}
void performSpecialFunction() override {
std::cout << "智能手機執行特殊功能:瀏覽網頁" << std::endl;
}
void lockScreen() override {
std::cout << "智能手機鎖定屏幕" << std::endl;
}
void powerOff() override {
std::cout << "智能手機關機" << std::endl;
}
};
// 具體類:老年機
class ElderlyPhone : public Phone {
protected:
void powerOn() override {
std::cout << "老年機開機" << std::endl;
}
void unlockScreen() override {
std::cout << "老年機解鎖屏幕" << std::endl;
}
void performSpecialFunction() override {
std::cout << "老年機執行特殊功能:大字體顯示" << std::endl;
}
void lockScreen() override {
std::cout << "老年機鎖定屏幕" << std::endl;
}
void powerOff() override {
std::cout << "老年機關機" << std::endl;
}
};
int main() {
Phone* smartPhone = new SmartPhone();
smartPhone->usePhone();
std::cout << std::endl;
Phone* elderlyPhone = new ElderlyPhone();
elderlyPhone->usePhone();
delete smartPhone;
delete elderlyPhone;
return 0;
}
Java 實現
// 抽象類:手機
abstract class Phone {
// 模板方法:定義手機的基本功能步驟
public final void usePhone() {
powerOn();
unlockScreen();
performSpecialFunction();
lockScreen();
powerOff();
}
// 抽象方法:開機
protected abstract void powerOn();
// 抽象方法:解鎖屏幕
protected abstract void unlockScreen();
// 抽象方法:執行特殊功能
protected abstract void performSpecialFunction();
// 抽象方法:鎖定屏幕
protected abstract void lockScreen();
// 抽象方法:關機
protected abstract void powerOff();
}
// 具體類:智能手機
class SmartPhone extends Phone {
@Override
protected void powerOn() {
System.out.println("智能手機開機");
}
@Override
protected void unlockScreen() {
System.out.println("智能手機解鎖屏幕");
}
@Override
protected void performSpecialFunction() {
System.out.println("智能手機執行特殊功能:瀏覽網頁");
}
@Override
protected void lockScreen() {
System.out.println("智能手機鎖定屏幕");
}
@Override
protected void powerOff() {
System.out.println("智能手機關機");
}
}
// 具體類:老年機
class ElderlyPhone extends Phone {
@Override
protected void powerOn() {
System.out.println("老年機開機");
}
@Override
protected void unlockScreen() {
System.out.println("老年機解鎖屏幕");
}
@Override
protected void performSpecialFunction() {
System.out.println("老年機執行特殊功能:大字體顯示");
}
@Override
protected void lockScreen() {
System.out.println("老年機鎖定屏幕");
}
@Override
protected void powerOff() {
System.out.println("老年機關機");
}
}
public class Main {
public static void main(String[] args) {
Phone smartPhone = new SmartPhone();
smartPhone.usePhone();
System.out.println();
Phone elderlyPhone = new ElderlyPhone();
elderlyPhone.usePhone();
}
}

浙公網安備 33010602011771號