zoukankan      html  css  js  c++  java
  • 装饰器模式

    动态地给一个对象添加一些额外的职责
    应用长景:

    1.生活中,当我们去购买手机的时候,经常会遇到套餐推荐。比如:只买一部裸机是多少钱,

    而外加一个保护膜,构成的套餐价是多少钱。亦或是外加一个保护膜,构成的套餐价多少钱。亦或是保护膜和耳机都要

    构成的套餐价是多少钱。

    代码:

    #include <iostream>
    using namespace std;
    
    const int IPHONE_PRICE = 5600;
    const int SCREEN_PROTECTOR_PRICE = 100;
    const int HEADSET_PRICE = 300;
    
    
    class Phone
    {
    public:
        virtual int cost() = 0;
    protected:
        int _price;
    };
    
    class IPhone : public Phone
    {
    public:
        IPhone()
        {
            _price = IPHONE_PRICE;
        }
    
        virtual int cost()
        {
            return _price;
        }
    };
    
    class PhoneDecorator : public Phone
    {
    public:
        PhoneDecorator(Phone *phone) :_phone(phone){}
    protected:
        Phone *_phone;
    };
    
    class ScreenProtectedPhone : public PhoneDecorator
    {
    public:
        ScreenProtectedPhone(Phone *phone) : PhoneDecorator(phone)
        {
            _price = SCREEN_PROTECTOR_PRICE;
        }
        virtual int cost()
        {
            cout << "屏保的价格为: " << _price << endl;
            return _price +_phone->cost();
        }
    
    };
    
    class HeadSetPhone : public PhoneDecorator
    {
    public:
        HeadSetPhone(Phone *phone) :PhoneDecorator(phone)
        {
            _price = HEADSET_PRICE;
        }
        virtual int cost()
        {
            cout << "耳机的价格为: " << _price << endl;
            return _price + _phone->cost();
        }
    };
    
    void test()
    {
        Phone *p = new IPhone; // iphone
        cout << "手机总价格为: " << p->cost() << endl;
        PhoneDecorator *p1 = new HeadSetPhone(p); // 给裸机加耳机
        cout << "手机总价格为: " << p1->cost() << endl;
        PhoneDecorator *p2 = new ScreenProtectedPhone(p); //给裸机加屏保
        cout << "手机总价格为: " << p2->cost() << endl;
        PhoneDecorator *p3 = new ScreenProtectedPhone(p1); //在加耳机的基础上家屏保
        cout << "手机总价格为: " << p3->cost() << endl;
    
        delete p3;
        delete p2;
        delete p1;
        delete p;
    }
    
    int main()
    {
        test();
        cin.get();
        return 0;
    }

    效果:

     2.随着科技的发展,将来的汽车不仅能跑,还可以在水里游,在天上飞

    #include <iostream>
    using namespace std;
    
    class Car
    {
    public:
        virtual void show() = 0;
    };
    
    class RunnableCar : public Car
    {
    public:
        virtual void show()
        {
            cout << "汽车能跑" << endl;
        }
    };
    
    class CarDecorator : public Car
    {
    public:
        CarDecorator(Car *car) :_car(car){  }
        virtual void show()
        {
            _car->show();
        }
    
    private:
        Car *_car;
    };
    
    class SwimCarDecorator : public CarDecorator
    {
    public:
        SwimCarDecorator(Car *car) :CarDecorator(car){}
        virtual void show()
        {
            CarDecorator::show();
            swim();
        }
    
        void swim()
        {
            cout << "汽车能在水里游" << endl;
        }
    
    };
    
    class FlyCarDecorator : public CarDecorator
    {
    public:
        FlyCarDecorator(Car *car) :CarDecorator(car){}
        virtual void show()
        {
            CarDecorator::show();
            fly();
        }
        void fly()
        {
            cout << "汽车能在天上飞" << endl;
        }
    };
    
    void test()
    {
        Car *c = new RunnableCar();
        c->show();
        Car *c1 = new SwimCarDecorator(c);
        c1->show();
        Car *c2 = new FlyCarDecorator(c);
        c2->show();
        Car *c3 = new FlyCarDecorator(c1);
        c3->show();
        delete c3;
        delete c2;
        delete c1;
        delete c;
    }
    
    int main()
    {
        test();
        cin.get();
        return 0;
    }

  • 相关阅读:
    请求分页中的内存分配
    Android开发实例总结
    出现java.lang.IllegalArgumentException异常
    请求分页中的内存分配之续
    HTTPCLIENT使用学习
    传输控制层协议TCP概述抄书
    freemarker中空值 null的处理 ?exists ?if_exists ?default(“”)
    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring 大新博客 推酷 360安全浏览器 7.1
    jade 学习笔记 gulp 自动编译
    @resource和@autowired的区别是什么CSDN论坛CSDN.NET中国最大的IT技术社区 Google Chrome
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6795770.html
Copyright © 2011-2022 走看看