장식 모드: 기능 추가 측면에서 장식 모드는 하위 클래스를 생성하는 것보다 더 유연합니다.
데코레이션 모드의 4가지 역할:
컴포넌트 클래스: Component
콘크리트 컴포넌트 클래스: ConereteComponent
데코레이션 클래스: Decorator(외부 클래스에서 확장) 함수 하지만 Component가 Decorator의 존재를 알 필요는 없습니다. )
콘크리트 장식 클래스: ConcreteDecorator(Component에 책임을 추가하는 기능)
여기서 사람들은 옷을 입습니다. 장식 모드를 구현하기 위한 예시로 수정합니다.
테스트 사례:
[code]int main(){ //初始化person(人)组件类Component,如果只有一个ConereteComponent类而不需要抽象的Component类,那么可以直接让Decorator继承具体的Component类。 concretePerson *cp = new concretePerson("Jarrett"); //初始化具体服饰类(装饰类Decorate) concreteTshirts *Tshirts = new concreteTshirts; concreteTrouser *Trouser = new concreteTrouser; concreteShoes *Shoe = new concreteShoes; //concreteSuit *Suit = new concreteSuit; concreteHat *Hat = new concreteHat; //依次进行装饰 Tshirts->decorate(cp); Trouser->decorate(Tshirts); Shoe->decorate(Trouser); //Suit->decorate(Shoe); //显示结果 Shoe->show(); std::cout << std::endl; //再装饰一次查看效果 Hat->decorate(Shoe); Hat->show(); return 0; }
장식 모드 구현:
[code]//主类 class concretePerson{ private: std::string name;//人名 public: concretePerson(){} concretePerson(std::string n):name(n){} //构造方式 virtual void show()const{ std::cout << name << "'s dress: "; } }; //服饰类(装饰类主类) class Finery: public concretePerson{ protected: concretePerson *cPerson;//重点是维护一个主体类对象 public: void decorate(concretePerson *cp){ cPerson = cp; } void show()const{ if(cPerson != NULL) cPerson->show(); } }; //具体服饰类Tshirts class concreteTshirts: public Finery{ public: void show()const{ Finery::show(); //调用基类方法 std::cout << "Tshirts "; //用此来修饰 } }; //具体服饰类Tshirts class concreteTrouser: public Finery{ public: void show()const{ Finery::show(); //调用基类方法 std::cout << "Trouser "; //用此来修饰 } }; //具体服饰类Tshirts class concreteShoes: public Finery{ public: void show()const{ Finery::show(); //调用基类方法 std::cout << "Shoe "; //用此来修饰 } }; //具体服饰类Tshirts class concreteSuit: public Finery{ public: void show()const{ Finery::show(); //调用基类方法 std::cout << "Suit "; //用此来修饰 } }; //具体服饰类Tshirts class concreteHat: public Finery{ public: void show()const{ Finery::show(); //调用基类方法 std::cout << "Hat "; //用此来修饰 } };
이와 같이 메인 클래스에서 클래스에 있는 장식적인 기능을 이동 및 제거하여 원본 클래스를 단순화할 수 있습니다. 클래스의 핵심 책임과 데코레이션 기능을 효과적으로 분리하고, 관련 클래스에서 반복되는 데코레이션 로직을 제거할 수 있습니다.
위는 의 장식 모드에 대한 간략한 소개 내용입니다. C++ 디자인 패턴 등 관련 내용은 PHP 중국어 홈페이지(m.sbmmt.com)를 참고해주세요!