[DP] Decorator pattern

      Comments Off on [DP] Decorator pattern

Được sử dụng khi tạo muốn tạo 1 đối tượng rồi trang trí cho nó
ví dụ. Tạo 1 đối tượng trà sữa, rồi trang trí cho nó, trà sữa-trân châu, trà sữa-tran chau sao đó có thể tính giá được.
code như sau:

#include <iostream>

class MilkTea{
public:
	virtual int price()=0; // pure virtual function
	virtual ~MilkTea(){
	}
};

class MilkTeaPure: public MilkTea{
public:
	virtual int price() override{
		return 30;
	}
	virtual ~MilkTeaPure(){
	    std::cout <<"~MilkTeaPure"<<std::endl;
	}
};

class TranChau: public MilkTea{
	MilkTea *milk;
public:
	virtual int price(){
		return milk->price() + 5;
	}
	TranChau(MilkTea *m):milk(m){}
	virtual ~TranChau(){
		std::cout <<"~TranChau"<<std::endl;
		delete milk;
	}
};

class Fruit:public MilkTea{
	MilkTea *milk;
public:
	int price() override{
		return milk->price()+10;
	}
	Fruit(MilkTea *m):milk(m){}
	virtual ~Fruit(){
		std::cout <<"~Fruit"<<std::endl;
		delete milk;
	}
};

int main(){
	MilkTea *m = new MilkTeaPure();
	std::cout << "Price of pure milk tea: "<<m->price() <<std::endl;
	MilkTea *tranchau = new TranChau(m);
	std::cout << "Price of MilkTea Tran Chau = " << tranchau->price() <<std::endl;
	Fruit* f = new Fruit(tranchau);
	std::cout << "Price of MilkTea+Tran Chau+ Fruit = "<<f->price() <<std::endl;
	delete f;
	return 0;
}