바닐라 : 1000
딸기 : 1500
초코 : 2000
아몬드 : 300
땅콩 : 200
키위 : 500
OCP 기능 확장에는 열려 있고 코드 변경에는 닫혀 있도록 해야 한다.
Decorator
객체(포장대상) - Item(동일 부모) – 포장지( Item& ) 재귀관점!!
cost() : item.cost() + 자신 // 자신을 꾸며서 리턴하므로 Decorator
연결. 데코레이터. 감싸주는것. 감싸서 기능을 합쳐준다.!!!!
아이템을 바꾸는건 전략 패턴..
아이템에 힘을 더해주는건 데코레이터 패턴
비행기를 생산하는건 팩토리 패턴..!!
#include
using namespace std;
// Decorator 패턴: 객체와 포장을 동일하게 다룬다.
// Subject와 포장(Decorator)가 가져야 하는 공통의 인터페이스
struct Item
{
virtual int cost() = 0;
};
// 각 Ice Cream 객체.. 대상(Subject).
class Valina: public Item
{
public:
virtual int cost() { return 1000; }
};
class Strawberry: public Item
{
public:
virtual int cost() { return 1500; }
};
class Choko: public Item
{
public:
virtual int cost() { return 2000; }
};
//----------------------------------------------------
// Decorator 객체들. 내부적으로 Subject의 참조를 가지고 있다.
class Almond : public Item
{
Item& item;
public:
Almond( Item& i ) : item(i) { }
virtual int cost()
{
return item.cost() + 300;
}
};
class Peanut : public Item
{
Item& item;
public:
Peanut( Item& i ) : item(i) { }
virtual int cost()
{
return item.cost() + 200;
}
};
class Kiwi : public Item
{
Item& item;
public:
Kiwi( Item& i ) : item(i) { }
virtual int cost()
{
return item.cost() + 500;
}
};
void main()
{
Valina ice;
Almond a( ice );
cout << a.cost() << endl;
Peanut p( a );
cout << p.cost() << endl;
}
////////////////////////////////////////////////////
// Decorator의 예 ..
// MFC에서
void main()
{
int n = 10;
CFile f( "a.txt", CFile::Create );
f.WriteFile( &n );
CArchive ar( &f, CArchive::store );
ar << n; // ok.
CSocketFile sf; // 네트워크
CArchive( &sf, CArchive::store );
ar2 >> n;
}