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;
    }

  • 相关阅读:
    java并发编程(五)lock
    java并发编程(一)线程状态 & 线程中断 & 线程间的协作
    java基础之 clone
    java基础 小知识点汇总篇
    java并发编程(四) 线程池 & 任务执行、终止源码分析
    GC(一)内存管理与垃圾回收
    java并发编程(三)cpu cache & 缓存一致性
    java并发编程(八) CAS & Unsafe & atomic
    @PathVariable注解
    redis分布式锁
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6795770.html
Copyright © 2011-2022 走看看