两种语言实现设计模式(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();
}
}