C ++デザインパターンコンポーネントコラボレーションテンプレートMothod

1.コンポーネントコラボレーションモード

  • 最新のソフトウェア専門知識の分割後の最初の結果は、「フレームワークとアプリケーションの分割」です。「コンポーネントコラボレーション」モードは、2つのモード間のコラボレーションで一般的に使用されるレイトバインディングを通じて、フレームワークとアプリケーション間の疎結合を実現します。

  • クラシックモード

  • テンプレートメソッド

  • 戦略

  • オブザーバー/イベント

二、テンプレート法

1.動機
  • ソフトウェア構築の過程で、特定のタスクについては、全体的な運用構造が安定していることがよくありますが、各サブステップには多くの変更要件があるか、固定された理由(フレームワークとアプリケーションの関係など)が原因です。 、タスクと対話できません。全体的な構造が同時に実現されます。
  • 安定した運用体制を決定することを前提にさまざまなサブステップの変更や実装要件の遅れに柔軟に対応するにはどうすればよいでしょうか。
2.モード定義
  • 動作中のアルゴリズムのスケルトンを定義し**(安定)、いくつかのステップをサブクラスに遅延(変更)しますテンプレートメソッドを使用すると、サブクラスは、アルゴリズムの特定のステップを変更(再利用)することなく、アルゴリズムの構造を再定義(オーバーライド)できます。
  • 安定したコードは非仮想関数として記述し、変更されたコードは仮想関数仮想として記述します。
  • 変化と安定性の間で、分離点を探します。変化と安定性の両方があります
3.コードを見せて

template1_lib.cpp

#include <iostream>
using namespace std;
//程序库开发人员
class Library{
    
    
public:
	void Step1(){
    
    
		cout << "Step1" << endl;
	}

	void Step3(){
    
    
		cout << "Step3" << endl;
	}

	void Step5(){
    
    
		cout << "Step5" << endl;
	}
};

template1_app.cpp

#include "template1_lib.cpp"
//应用程序开发人员
class Application{
    
    
  public:
	bool Step2(){
    
    
		cout << "myStep2" << endl;
		return true;
	}

	void Step4(){
    
    
		cout << "myStep4" << endl;
	}
};

int main()
{
    
    
	Library lib;
	Application app;

	lib.Step1();

	if (app.Step2()){
    
    
		lib.Step3();
	}

	for (int i = 0; i < 4; i++){
    
    
		app.Step4();
	}

	lib.Step5();
}

ここに画像の説明を挿入します
最初の方法は、開発者がフレームワークスタッフに電話することです。

=======================================
テンプレートメソッドを使用する
template2_lib.cpp:プロセスにはフレームワーク担当者がいます定義、特定のメソッドは開発者によって書き直されます

#include <iostream>

using namespace std;

//程序库开发人员
class Library
{
    
    
  public:
    //稳定 template method
    void Run()
    {
    
    
        Step1();
        
        if (Step2()){
    
      // 调用子类中的虚函数
            //支持变化 ==> 虚函数的多态调用
            Step3();
        }

        for (int i = 0; i < 4; i++){
    
    
            Step4(); //支持变化 ==> 虚函数的多态调用
        }
        Step5();
    }
    // 基类,析构函数写虚函数(否则子类会调用基类析构函数)
    virtual ~Library() {
    
    }   

  protected:
    void Step1(){
    
    //稳定
        cout << "Step1" << endl;
    }
    void Step3(){
    
     //稳定
        cout << "Step3" << endl;
    }
    void Step5(){
    
       //稳定
        cout << "Step5" << endl;
    }

    virtual bool Step2() = 0; //变化
    virtual void Step4() = 0; //变化
};

template2_app.cpp

#include "template2_lib.cpp"
#include <iostream>

using namespace std;


class Application : public Library
{
    
    
  protected:
	virtual bool Step2(){
    
    
		cout << "override Step2" << endl;
		return true;
	}

	virtual void Step4(){
    
    
		cout << "override Step4" << endl;
	}
};

int main()
{
    
    
	Library *pLib = new Application();  // 多态指针
	pLib->Run();

	delete pLib;
}

ここに画像の説明を挿入します
2つ目は、フレームワークスタッフによって定義された仮想関数です。

リレーションシップコーミング:アーリーバインディングからレイトバインディング
ここに画像の説明を挿入します
クラス図:

AbstractClass PrimitivaeOperation1() : virtual PrimitivaeOperation2() : virtual ConcreteClass PrimitivaeOperation1() : override PrimitivaeOperation2() : override virtual PrimitivaeOperation1() PrimitivaeOperation2()
4.要点のまとめ
  • テンプレートメソッドパターンは非常に基本的なデザインパターンであり、オブジェクト指向システムで多数のアプリケーションがあります。これは、最も単純なメカニズム(仮想関数のポリモーフィズム)を使用して、多くのアプリケーションに柔軟な拡張ポイントを提供し、コード再利用の基本的な実装構造です。
  • サブステップの変更に柔軟に対応することに加えて、「電話しないで、電話させてください」という逆制御構造は、テンプレートメソッドの典型的なアプリケーションです。
  • 特定の実装に関しては、テンプレートメソッドによって呼び出される仮想関数メソッドには実装がある場合とない場合があります(抽象メソッド、純粋仮想メソッド)が、通常は保護されたメソッドとして設定されます(通常は外部呼び出し用ではありません)。

仮想関数、関数ポインター遅延バインディングメカニズム

------------------------------------------

#include<iostream>
using namespace std;

class AbstractClass
{
    
    
public:
    // 预定义 虚函数
    virtual void primitiveOp1() = 0;
    virtual void primitiveOp2() = 0;

    virtual ~AbstractClass(){
    
    };
};

class ConcreteClass:public AbstractClass
{
    
    
public:
    virtual void primitiveOp1()
    {
    
    
        cout << "Doing Op1..." << endl;
    }

    virtual void primitiveOp2()
    {
    
    
        cout << "Doing Op2..." << endl;
    }
};


int main()
{
    
    
    AbstractClass *p = new ConcreteClass();
    p->primitiveOp1();
    p->primitiveOp2();
    delete p;
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_40437821/article/details/111463010