示例问题:
一个网页里面包含图片的展示,这些图片根据来源不同,有不同的加载显示方式,如何实现?
分析:
这是一个典型的父子类之间的继承、多态问题。需要将网页展示的共同部分在父类中实现,子类分别实现不同的图片加载显示方法即可。这是我们常用的父子类之间的继承、多态的应用,其实这也是一种设计模式,即模板方法模式。
解决方案:
Template.h
定义了网页展示的基类,及包含图片展示的3种网页展示子类
#pragma once
#include <iostream>
class CCommonWebDisplay
{
public:
CCommonWebDisplay()
{
}
virtual ~CCommonWebDisplay()
{
}
void DisplayAll()
{
GenealOperation();
DisplayText();
DisplayPic();
}
void DisplayText()
{
std::cout << "展示文本信息" << std::endl;
}
void GenealOperation()
{
std::cout << "基本操作" << std::endl;
}
virtual void DisplayPic() = 0;
};
class CWebDisplayPicA : public CCommonWebDisplay
{
public:
CWebDisplayPicA()
{
}
virtual ~CWebDisplayPicA()
{
}
void DisplayPic()
{
std::cout << "加载展示图片A方法(需要用户名、密码)" << std::endl;
}
};
class CWebDisplayPicB : public CCommonWebDisplay
{
public:
CWebDisplayPicB()
{
}
virtual ~CWebDisplayPicB()
{
}
void DisplayPic()
{
std::cout << "加载展示图片C方法(不需要用户名、密码)" << std::endl;
}
};
class CWebDisplayPicC : public CCommonWebDisplay
{
public:
CWebDisplayPicC()
{
}
virtual ~CWebDisplayPicC()
{
}
void DisplayPic()
{
std::cout << "加载展示图片C方法(FTP下载到本地后展示)" << std::endl;
}
};
main.cpp
// main.cpp : 定义控制台应用程序的入口点。
//
#include "Template.h"
int main()
{
std::cout << "当前网页展示分为三个模块" << std::endl;
std::cout << "第一个模块:" << std::endl;
CWebDisplayPicA WebPartA;
WebPartA.DisplayAll();
std::cout << "第二个模块:" << std::endl;
CWebDisplayPicB WebPartB;
WebPartB.DisplayAll();
std::cout << "第三个模块:" << std::endl;
CWebDisplayPicC WebPartC;
WebPartC.DisplayAll();
system("pause");
return 0;
}
结果:
模板方法模式解决的问题:
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
返回目录:设计模式(C++实现)(总)