您的位置:首页 > 其它

设计模式实现(七)--- 模板方法模式(Template Method)

2014-07-29 16:41 603 查看
概述:

如果继承有意义,就应该要称为子类的模板,所有重复的代码都应该上升到父类中区,而不是让每个子类都一一重复。

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可定重定义该算法的某些特定步骤。

模板方法的特点:

模板方法模式是通过把不变行为搬到超类,去除子类中的重复代码来体现它的优势。提供了一个很好的代码复用平台。

当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。



模板方法模式原型实现

#include <stdio.h>
/*
AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,
它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
*/
class AbstractClass
{
public:
//一些抽象方法,放到子类中去实现
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
public:
//模板方法
void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
}
};
/*
ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass
都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
*/
class ConcreteClassA : public AbstractClass
{
public:
void PrimitiveOperation1()
{
printf("具体类A方法实现1\n");
}
void PrimitiveOperation2()
{
printf("具体类A方法实现2\n");
}
};
class ConcreteClassB : public AbstractClass
{
public:
void PrimitiveOperation1()
{
printf("具体类B方法实现1\n");
}
void PrimitiveOperation2()
{
printf("具体类B方法实现2\n");
}
};

客户端
int main()
{
AbstractClass *c;
c = new ConcreteClassA();
c->TemplateMethod();

c = new ConcreteClassB();
c->TemplateMethod();
return 1;
}


模板方法模式例子

#include <stdio.h>
//一个抄题,答题程序
//AbstractClass
class Test
{
public:
virtual char answer1() = 0;
virtual char answer2() = 0;
public:
virtual void TestQuestion1()
{
printf("第一题:1 + 3 = 【】 \n a.4 b.5 c.6 d.7 \n ");
printf("答案:%c\n",answer1());
}
virtual void TestQuestion2()
{
printf("第二题:1 * 3 = 【】 \n a.3 b.5 c.6 d.7 \n ");
printf("答案:%c\n",answer2());
}
};
//ConcreteClass
class TestPaperA : public Test
{
public:
char answer1()
{
return 'a';
}
char answer2()
{
return 'a';
}
};
class TestPaperB : public Test
{
public:
char answer1()
{
return 'b';
}
char answer2()
{
return 'c';
}
};
//客户端
int main()
{
Test *base;
base = new TestPaperA();		//此处用父类指针
base->TestQuestion1();
base->TestQuestion2();

base = new TestPaperB();		//此处用父类指针
base->TestQuestion1();
base->TestQuestion2();
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐