Python面向对象---设计模式漫谈1

上一次我们谈到了面向对象中一个设计模式:装饰器模式。

我们现在来看一下在没有Python这样装饰器机制的情况下,如何来实现这样的装饰器模式

我们下面拿C++语言来示例:

看下面一个例子:

class Cake
{

public:
    virtual void showCake() = 0; // 接口
    virtual ~Cake() {};
    std::string name;
};

class ConcreteCake :public Cake
{
public:
    ConcreteCake()
    {
        name = "原始蛋糕";
    }
    void showCake() { std::cout << name.c_str() << std::endl; };
    virtual  ~ConcreteCake() {};
};

class CakeDecrator :public Cake
{
protected:
    Cake* pCake;  //维护一个Cake对象的引用,为Cake对象添加装饰
public:
    virtual void showCake() = 0; // 有接口,是抽象类
    virtual    ~CakeDecrator() {};
};

class CakeDecratorMilk : public CakeDecrator
{
public:
    CakeDecratorMilk(Cake* pCake)
    {
        this->pCake = pCake;
    }
    void showCake()
    {
        this->name = pCake->name + "加奶油";
        std::cout << name.c_str() << std::endl;
    };
    virtual ~CakeDecratorMilk() {};
};

// 这样我们可以来测试一下程序

int main()
{

    # 原味的蛋糕
    ConcreteCake *pConCake = new ConcreteCake();
    pConCake->showCake(); //原始蛋糕

    CakeDecratorMilk* pDecMilk = new CakeDecratorMilk(pConCake);
    pDecMilk->showCake();  //原始蛋糕加奶油

    delete pConCake;
    delete pDecMilk;
    return 0;
}
 

这样,如果有一天,我们希望在现在的奶油蛋糕上再增加其他的味道,比如巧克力,则可以这样:

添加一个新的类

class CakeDecratorCholate : public CakeDecrator
{
public:
    CakeDecratorCholate(Cake* pCake)
    {
        this->pCake = pCake;
    }
    void showCake()
    {
        this->name = pCake->name + "加巧克力";
        std::cout << name.c_str() << std::endl;
    };
    virtual ~CakeDecratorCholate() {};
};

// 然后可以写出下面的测试代码:

int main()
{
    ConcreteCake *pConCake = new ConcreteCake();
    pConCake->showCake(); // 原始蛋糕

    CakeDecratorMilk* pDecMilk = new CakeDecratorMilk(pConCake);
    pDecMilk->showCake();  // 原始蛋糕加奶油
    CakeDecratorCholate *pDecCho = new CakeDecratorCholate(pDecMilk);
    pDecCho->showCake();  // 原始蛋糕加奶油加巧克力

    delete pConCake;
    delete pDecMilk;
    delete pDecCho;

    return 0;
}
我们发现,这里也没有修改过原来的代码逻辑,而是通过扩充一个类的方式来实现装饰器的效果(扩充功能)。

这就是在C++中实现装饰器模式的过程,我们发现需要引入一个中间的类CakeDecrator ,来帮助我们完成新类对原来类的扩充。这也是面向对象编程,面向对象设计模式的精髓之处。

下面几节,我们会一步步来讨论面向对象的设计模式及23中常见的面向对象的设计模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值