设计模式之模板模式

Template Method介绍
  • 定义一个操作中算法的骨架, 将一些具体在步骤的实现延迟到子类, 即可以在不改变一个算法的结构的基础上,通过子类就可以重定义算法的某些特定步骤;
适用性
  • 一次性定义了一个算法的固定部分, 将可变的部分留给来实现;
  • 将子类中的重复的行为提取到父类中来以避免代码的重复;
  • 控制子类的扩展;
理解
  • 简单来说,就是将子类中共用的行为提取出来做成一个模板方法放在基类中, 并由子类实现特定的行为来填补模板;
例子
  • 情人节到了, 小明想要为小梦做道烛光晚餐CandleLightDinner, 于是小明跑到超市买了菜BuyFood()准备做一道小梦最爱吃的香菇炖鸡ChickenMushroom, 并去蛋糕店订了一个水果蛋糕FriutCake, 然后又去花店订了一束花BookFlowers(); 最后就是和小梦一起享受烛光晚餐了;
代码
class CandleLightDinner
{
public:
    void TmpltForPrepareDinner()
    {
        PrimBuyFood();
        PrimCookFood();
        PrimBookCacke();
        PrimBookFlowers();
    }
protected:
    virtual void PrimBuyFood() = 0;
    virtual void PrimCookFood() = 0;
    virtual void PrimBookCacke() = 0;
    virtual void PrimBookFlowers() = 0;
};
// 具体的操作类
class DinnerForMingAndMeng : public CandleLightDinner
{
public:
    virtual void PrimBuyFood()
    {
        cout<<"xiaoming go to supermarket buy Chicken and  mushrooms"<<endl;
    }
    virtual void PrimCookFood()
    {
        cout<<"xiaoming is cooking the ChickenMushroom" <<endl;
    }
    virtual void PrimBookCacke()
    {
        cout<<"xiaoming is booking a fruitCake"<<endl;
    }
    virtual void PrimBookFlowers()
    {
        cout<<"xiaoming is booking a rose for xiaomeng"<<endl;
    }
};
int main()
{
    CandleLightDinner* dinner = new DinnerForMingAndMeng;
    dinner->TmpltForPrepareDinner();
    return 0;
}
总结
  • 如上面的例子所示, 男朋友为女朋友自己准备烛光晚餐, 则可能会有一套固定的流程:买菜做对方最爱的菜, 做菜, 买个蛋糕, 订花, 而对于不同的情侣, 具体最爱吃什么菜, 喜欢什么花, 蛋糕都是不一样的,这时将整个流程提取出来, 对于具体的细节则由各个情侣子类自己去实现, 父类的模板方法中只调用纯虚函数接口即可.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值