• 设计模式之装饰模式


     #include "stdafx.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    /*************************************
    装饰模式
    *************************************/
    
    class Person {
    public:
    	Person(){}
    	Person(string strName) :name_(strName) {}
    	virtual void Show() {
    		cout << " 装饰的 "<< name_ << endl;
    	}
    private:
    	Person(const Person& p);
    	string name_;
    };
    
    /*
    抽象 装饰
    */
    
    class Finery :public Person{
    public:
    	Finery():p_(NULL){}
    	void Decorate(Person* p){
    		p_ = p; 
    	}
    
    	void Show() {
    		if (p_) {
    			p_->Show();
    		}
    	}
    protected:
    	Person* p_;
    };
    /*
    具体装饰
    */
    class TShirts :public Finery {
    public:
    	void Show() {
    		cout << "T恤衫" << " ";
    		Finery::Show();
    	}
    };
    
    /*
    具体装饰
    */
    class BigTrousers :public Finery {
    public:
    	void Show() {
    		cout << "大垮裤" << " ";
    		Finery::Show();
    	}
    };
    
    class LeatherShoes : public Finery{
    public:
    	void Show()
    	{
    		std::cout << "皮鞋" << " ";
    		Finery::Show();
    	}
    };
    
    
    int main()
    {
    	Person* p = new Person("行人");
    	TShirts* pts = new TShirts();
    	BigTrousers* pbt = new BigTrousers();
    	LeatherShoes* pls = new LeatherShoes();
    	pts->Decorate(p);
    	pbt->Decorate(pts);
    	pls->Decorate(pbt);
    	pls->Show();
    return 0; }

    为一个类添加额外的功能装饰

    参考 大话设计模式

  • 相关阅读:
    求欧拉路径模版 fleury算法
    回学校前的计划
    高斯消元模版
    usaco 3.2 Stringsobits 数位dp
    dijkstra模版
    codeforces AIM Tech Round (Div. 2)
    bnuoj 51275 并查集按深度合并建树
    bzoj3674: 可持久化并查集
    poj2104 求区间第k大 可持久化线段树
    Miller_Rabin判断素数模版
  • 原文地址:https://www.cnblogs.com/itdef/p/5021457.html
Copyright © 2020-2023  润新知