假设我有一个宠物商店的C++应用程序,它开始于Cats.该应用程序有一个类,它为Cat对话框执行一些数据处理:
CatDlg.cpp:
CatDlg::CatDlg() {//ctor stuff}
CatDlg::onInitDialog() {
DBAccess db;
db.open();
CatRec cat;
cat = db.findRec(m_catID);
CString name = cat.getName();
NameField.SetWindowText(name);
// other catty dialogy stuff
}
Run Code Online (Sandbox Code Playgroud)
现在商店所有者想要将Dogs添加到应用程序中.除数据类型外,Dog数据与Cat数据基本相同.我可以复制CatDlg类,更改几种类型并以这种方式处理它,但这导致维护问题和代码膨胀,99%重复代码:
DogDlg.cpp:
DogDlg::onInitDialog() {
DBAccess db;
db.open();
DogRec dog;
dog = db.findRec(m_dogID);
CString name = dog.getName();
NameField.SetWindowText(name);
// other doggy dialogy stuff
}
Run Code Online (Sandbox Code Playgroud)
或者,我可以通过传入指示动物类型的标志来更改对话框类以处理多个动物,然后相应地处理它.当主人添加新动物时,这也会变得更加丑陋,因为该方法变得更长,有许多重复的代码块:
AnimalDlg.cpp:
AnimalDlg::onInitDialog(AnimalType type) {
DBAccess db;
db.open();
if(type == CAT)
{
CatRec cat;
cat = db.findRec(m_catID);
CString name = cat.getName();
}
else if(type == DOG)
{
DogRec dog;
dog = …Run Code Online (Sandbox Code Playgroud)