>  기사  >  백엔드 개발  >  C++ 디자인 패턴의 장식 모드에 대한 간략한 소개

C++ 디자인 패턴의 장식 모드에 대한 간략한 소개

黄舟
黄舟원래의
2017-01-18 14:48:421156검색

장식 모드: 기능 추가 측면에서 장식 모드는 하위 클래스를 생성하는 것보다 더 유연합니다.

데코레이션 모드의 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 << "&#39;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 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.