装饰模式笔记(网络改编而成)

//装饰模式:在不改变原有类的情况下,并没有破坏原有风格,动态的给类添加新的职责,
//如果使用继承拓展新的功能,不符合设计模式的开闭原则,同时给系统增加了子类
//增加了系统的复杂性,继承在编译时就确定了某些关系
#import <Foundation/Foundation.h>
#include <string>
#include <iostream>
using namespace::std;
class Hamburger{
public:
    Hamburger(){
    }
    ~Hamburger(){
    }
public:
    virtual float get_privice(){
        return 0.0f;
    }
    virtual std::string get_name(){
       return "";
    }
};

class ChickerHamburger:public Hamburger{
public:
    float get_privice(){
        return 11.0f;
    }
    std::string get_name(){
        return "鸡腿汉堡包";
    }
};

class BeefHamburger:public Hamburger{
public:
    float get_privice(){
        return 12.0f;
    }
    std::string get_name(){
        return "牛肉汉堡包";
    }
};

//调料
class Condiment:public Hamburger{
protected:
    Hamburger* _hamburger;
public:
    Condiment(){

    }
    Condiment(Hamburger* hamburger):_hamburger(hamburger){
    }
};

class Chilli: public Condiment{
    
public:
    Chilli(Hamburger* hamburger){
        this -> _hamburger = hamburger;
    }
    float get_privice(){
       return 2.0f + _hamburger -> get_privice();
    }
    std::string get_name(){
       return " 辣椒 + " + _hamburger -> get_name();
    }
};

class Cream: public Condiment{
    
public:
    Cream(Hamburger* hamburger){
       this -> _hamburger = hamburger;
    }
   float get_privice(){
       return 2.0f + _hamburger -> get_privice();
    }
   std::string get_name(){
       return " 奶油 + " + _hamburger -> get_name();
   }
};

class Egg: public Condiment{
public:
    Egg(Hamburger* hamburger){
      this -> _hamburger = hamburger;
    }
    
   float get_privice(){
       return 4.0f + _hamburger -> get_privice();
    }
    
   std::string get_name(){
       return " 鸡蛋 + " + _hamburger -> get_name();
   }
};

class essence: public Condiment{
public:
    essence(Hamburger* hamburger){
        this -> _hamburger = hamburger;
    }
   float get_privice(){
       return 2.0f + _hamburger -> get_privice();
    }
   std::string get_name(){
       return " 香精 + " + _hamburger -> get_name();
   }
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Hamburger* hamburger = new BeefHamburger();
        std::cout << hamburger -> get_name() << " 价格:" << hamburger -> get_privice() << std::endl;
        
        hamburger = new essence(hamburger);
        std::cout << hamburger -> get_name() << " 价格:" << hamburger -> get_privice() << std::endl;
        
        hamburger = new Egg(hamburger);
        std::cout << hamburger -> get_name() << " 价格:" << hamburger -> get_privice() << std::endl;
        
        hamburger = new Cream(hamburger);
        std::cout << hamburger -> get_name() << " 价格:" << hamburger -> get_privice() << std::endl;
        
        hamburger = new Chilli(hamburger);
        std::cout << hamburger -> get_name() << " 价格:" << hamburger -> get_privice() << std::endl;
        
        hamburger = new Egg(hamburger);
        std::cout << hamburger -> get_name() << " 价格:" << hamburger -> get_privice() << std::endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值