设计模式之模板模式(Template Method)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w_x_myself/article/details/82148247

1、定义

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

2、介绍

优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。

3、源码

3.1、头文件

HummerModel.h

#pragma once
#include<iostream>
using namespace std;
class CHummerModel
{
public:
    CHummerModel(void);
    virtual ~CHummerModel(void);
    void Run();
protected:
    virtual void Start() = 0;
    virtual void Stop() = 0;
    virtual void Alarm() = 0;
    virtual void EngineBoom() = 0;
    virtual bool IsAlarm();
};

 HummerH1Model.h

#pragma once
#include "hummermodel.h"
class CHummerH1Model :
    public CHummerModel
{
public:
    CHummerH1Model(void);
    ~CHummerH1Model(void);
    void SetAlarm(bool tag);
    void Start();
    void Stop();
    void Alarm();
    void EngineBoom();
    bool IsAlarm();
private:
    bool m_isAlarm;
};

 HummerH2Model.h

#pragma once
#include "hummermodel.h"
class CHummerH2Model :
	public CHummerModel
{
public:
	CHummerH2Model(void);
	~CHummerH2Model(void);
	void Start();
	void Stop();
	void Alarm();
	void EngineBoom();
	bool IsAlarm();
};

3.2、实现

HummerModel.cpp

#include "HummerModel.h"
CHummerModel::CHummerModel(void)
{
}
CHummerModel::~CHummerModel(void)
{
}
void CHummerModel::Run()
{
	//先发动汽车
	Start();
	//引擎开始轰鸣
	EngineBoom();
	//然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭
	if (IsAlarm())
		Alarm();

	//到达目的地就停车
	Stop();
}
bool CHummerModel::IsAlarm()
{
	//钩子方法,默认喇叭是会响的
	return true;
}

HummerH1Model.cpp

扫描二维码关注公众号,回复: 2966367 查看本文章
#include "HummerH1Model.h"

CHummerH1Model::CHummerH1Model(void)
{
	m_isAlarm = true;
}
CHummerH1Model::~CHummerH1Model(void)
{
}
void CHummerH1Model::Start()
{
	cout << "悍马H1发动..." << endl;
}
void CHummerH1Model::Stop()
{
	cout << "悍马H1停车..." << endl;
}
void CHummerH1Model::Alarm()
{
	cout << "悍马H1鸣笛" << endl;
}
void CHummerH1Model::EngineBoom()
{
	cout << "悍马H1引擎声音是这样...." << endl;
}
bool CHummerH1Model::IsAlarm()
{
	return this->m_isAlarm;
}
void CHummerH1Model::SetAlarm(bool tag)
{
	this->m_isAlarm = tag;
}

HummerH2Model.cpp

#include "HummerH2Model.h"

CHummerH2Model::CHummerH2Model(void)
{
}
CHummerH2Model::~CHummerH2Model(void)
{
}
void CHummerH2Model::Start()
{
	cout << "悍马H2发动..." << endl;
}
void CHummerH2Model::Stop()
{
	cout << "悍马H2停车..." << endl;
}
void CHummerH2Model::Alarm()
{
	cout << "悍马H2鸣笛" << endl;
}
void CHummerH2Model::EngineBoom()
{
	cout << "悍马H2引擎声音是这样...." << endl;
}
bool CHummerH2Model::IsAlarm()
{
	return false;
}

4、结果

参考文献:《菜鸟教程》   https://blog.csdn.net/phiall/article/details/52199659博客

猜你喜欢

转载自blog.csdn.net/w_x_myself/article/details/82148247