ホームページ  >  記事  >  バックエンド開発  >  C++ デザイン パターンのデコレーション モードの簡単な紹介

C++ デザイン パターンのデコレーション モードの簡単な紹介

黄舟
黄舟オリジナル
2017-01-18 14:48:421146ブラウズ

装飾モード: 機能を追加するという点では、装飾モードはサブクラスを生成するよりも柔軟です。

デコレーションモードの4つの役割:

コンポーネントクラス:Component

特定コンポーネントクラス:ConereteComponent

Decorationクラス:Decorator(コンポーネントクラスの機能を外部クラスから拡張しますが、コンポーネントは必要ありません) )

具体的な装飾クラス: ConcreteDecorator (コンポーネントに責任を追加する機能)

ここでは、装飾モードを実装するために人の服装を例に挙げます。

テストケース:

[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 中国語 Web サイト (www.php.cn) を参照してください。 !


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。