記事- 「デザインパターンの概要は、スキーマを作成する」スキーマ作成の5種類を仕上げ、そして今日は、構造モデルを整理して行きました。
構造モデルは、より大きなクラスまたはオブジェクト構造を形成するために一緒に結合する方法を説明することを意図しています。関心のクラスベースの構造モデル、および一般のみが達成される継承関係の組み合わせ、構造モデル合成オブジェクトクラスと関心のオブジェクトは、クラスのオブジェクト・クラスの別のインスタンスによって定義された関係、及び、オブジェクトをそのような達成すること(システム私たちは今、このアプリケーションの開発がたくさんある)メソッドを呼び出します。ほとんどの構造モデルは、オブジェクト構造モデルです。
特定パターン、それぞれ、アダプタモード、ブリッジモード、合成モード、装飾的なパターン、パターン出現、フライ級、プロキシモードの7種類の合計の構造モデル。
私たちは、定義し、次のようにいくつかの簡単な構造モデルを見ていきますについて説明します。
1.アダプタモード(Adapterパターン)
アダプタ動作モードは、アダプタはまた、ラッパーと呼ばれるように、インターフェースクラスは、ワークと互換性があり得ることインターフェースの別の形態にインターフェースの形に変換されます。モデルクラス構造としてアダプタモード、構造、オブジェクトモデルとして使用することができます。
モードアダプタは、4つのロールが含まれます
(1)特定の抽象クラスターゲット
(2)クラスアダプタアダプタ
(3)Adapteeフィッタ基づいて
顧客のクライアントクラス、またはユーザのクラス、すなわち、発信者(4)。
サンプルコード:
#include <iostream>
#include "Adapter.h"
#include "Adaptee.h"
#include "Target.h"
using namespace std;
int main(int argc, char *argv[])
{
Adaptee * adaptee = new Adaptee();
Target * tar = new Adapter(adaptee);
tar->request();
return 0;
}
///////////////////////////////////////////////////////////
// Adapter.h
// Definition of the Class Adapter
///////////////////////////////////////////////////////////
#include "Target.h"
#include "Adaptee.h"
class Adapter : public Target
{
public:
Adapter(Adaptee *adaptee);
virtual ~Adapter();
virtual void request();
private:
Adaptee* m_pAdaptee;
};
///////////////////////////////////////////////////////////
// Adapter.cpp
// Implementation of the Class Adapter
///////////////////////////////////////////////////////////
#include "Adapter.h"
Adapter::Adapter(Adaptee * adaptee)
{
m_pAdaptee = adaptee;
}
Adapter::~Adapter()
{
}
void Adapter::request()
{
m_pAdaptee->specificRequest();
}
///////////////////////////////////////////////////////////
// Adaptee.h
// Definition of the Class Adaptee
///////////////////////////////////////////////////////////
class Adaptee
{
public:
Adaptee();
virtual ~Adaptee();
void specificRequest();
};
アダプタモデル適用シナリオ:
(1)システムは、システムのニーズを満たしていない既存のクラス、インタフェースの使用を必要とする;
(2)は、互いの間であまり相関のために再利用可能なクラスを確立することを望みますクラスを整理するために一緒に働きます。
2.ブリッジモード(ブリッジパターン)
ブリッジモードでは、2つの、またシャンク部材(ハンドル本体)モード又はインタフェース(インタフェース)モードとして知られている、独立して変化させることができるように、その実装の抽象部分的分離です。
:ブリッジモードは、4つの役割含有
(1)抽象クラス抽象化
(2)拡張抽象クラスRefinedAbstraction
(3)インタフェースの実装クラスインプリメンタ
実装クラスConcreteImplementor(4)。
サンプルコード:
#include <iostream>
#include "ConcreteImplementorA.h"
#include "ConcreteImplementorB.h"
#include "RefinedAbstraction.h"
#include "Abstraction.h"
using namespace std;
int main(int argc, char *argv[])
{
Implementor * pImp = new ConcreteImplementorA();
Abstraction * pa = new RefinedAbstraction(pImp);
pa->operation();
Abstraction * pb = new RefinedAbstraction(new ConcreteImplementorB());
pb->operation();
delete pa;
delete pb;
return 0;
}
///////////////////////////////////////////////////////////
// RefinedAbstraction.h
// Definition of the Class RefinedAbstraction
///////////////////////////////////////////////////////////
#include "Abstraction.h"
class RefinedAbstraction : public Abstraction
{
public:
RefinedAbstraction();
RefinedAbstraction(Implementor* imp);
virtual ~RefinedAbstraction();
virtual void operation();
};
///////////////////////////////////////////////////////////
// RefinedAbstraction.cpp
// Implementation of the Class RefinedAbstraction
///////////////////////////////////////////////////////////
#include "RefinedAbstraction.h"
#include <iostream>
using namespace std;
RefinedAbstraction::RefinedAbstraction()
{
}
RefinedAbstraction::RefinedAbstraction(Implementor* imp)
:Abstraction(imp)
{
}
RefinedAbstraction::~RefinedAbstraction()
{
}
void RefinedAbstraction::operation()
{
cout << "do something else ,and then " << endl;
m_pImp->operationImp();
}
難しさのある程度理解してモードを埋めます。2は、独立して変化することができるように重要なのは、どのように抽象モデルと実装の分離です。ブリッジモードを分離するように非干渉の両方で変更することはなく、継承関係を使用する、システムの実現との間のソフトウェア抽象化を指します。ビデオの再生を超えるなどのWindows、Linuxなどの異なるオペレーティングシステムで使用することができるクロスプラットフォームのビデオプレーヤー、iOSのを想像してみて異なるフォーマットなので、上のMP4、AVI、WMVなどのファイルと。
3.装飾的なパターン(Decoratorパターン)
装飾的なパターンを動的にいくつかの追加の責任を追加するためのオブジェクトであり、対象は機能性の面で増加し、装飾的なパターンは、サブクラスよりも柔軟です。装飾的なパターンとより多くのアダプタモードのように、彼らは異なるシナリオに適用されます。
装飾的なパターンは、4つの役割が含まれます
(1)抽象コンポーネント部品
(2)特定の部材ConcreteComponentを
(3)抽象装飾デコレータ
(4)特に装飾ConcreteDecorator
サンプルコード:
///////////////////////////////////////////////////////////
// ConcreteComponent.cpp
// Implementation of the Class ConcreteComponent
///////////////////////////////////////////////////////////
#include "ConcreteComponent.h"
#include <iostream>
using namespace std;
ConcreteComponent::ConcreteComponent()
{
}
ConcreteComponent::~ConcreteComponent()
{
}
void ConcreteComponent::operation()
{
cout << "ConcreteComponent's normal operation!" << endl;
}
///////////////////////////////////////////////////////////
// ConcreteDecoratorA.h
// Definition of the Class ConcreteDecoratorA
///////////////////////////////////////////////////////////
#include "Decorator.h"
#include "Component.h"
class ConcreteDecoratorA : public Decorator
{
public:
ConcreteDecoratorA(Component* pcmp);
virtual ~ConcreteDecoratorA();
void addBehavior();
virtual void operation();
};
///////////////////////////////////////////////////////////
// ConcreteDecoratorA.cpp
// Implementation of the Class ConcreteDecoratorA
///////////////////////////////////////////////////////////
#include "ConcreteDecoratorA.h"
#include <iostream>
using namespace std;
ConcreteDecoratorA::ConcreteDecoratorA(Component* pcmp):Decorator(pcmp)
{
}
ConcreteDecoratorA::~ConcreteDecoratorA()
{
}
void ConcreteDecoratorA::addBehavior()
{
cout << "addBehavior AAAA" << endl;
}
void ConcreteDecoratorA::operation()
{
Decorator::operation();
addBehavior();
}
継承関係と比較すると、カプセル化クラスの優位性を破壊しない、特に維持期におけるシステムの挙動の増加のための疎結合の関係、です。Decoratorパターンは、動的オブジェクトの拡張機能を実装し、より多くのサブクラスを作成せずに、より多くのオブジェクトの振る舞いに取り付けることができます。
4.アピアランスモデル(Facadeパターン)
これらのサブシステムを介して外部と通信する、システム内のサブシステムのセットを一貫したレベル・インターフェース(オブジェクトの外観)を提供し、モデルと呼ばれる正面外観モデルは、物体の外観でなければなりません。
二つの役割を含む出現パターン:
(1)外観ロールファサード
(2)サブシステムの役割サブシステム
サンプルコード:
#include <iostream>
#include "Facade.h"
using namespace std;
int main(int argc, char *argv[])
{
Facade fa;
fa.wrapOpration();
return 0;
}
///////////////////////////////////////////////////////////
// Facade.h
// Definition of the Class Facade
///////////////////////////////////////////////////////////
#ifndef __FACADE_H__
#define __FACADE_H__
#include "SystemC.h"
#include "SystemA.h"
#include "SystemB.h"
class Facade
{
public:
Facade();
virtual ~Facade();
void wrapOpration();
private:
SystemC *m_SystemC;
SystemA *m_SystemA;
SystemB *m_SystemB;
};
#endif
///////////////////////////////////////////////////////////
// Facade.cpp
// Implementation of the Class Facade
///////////////////////////////////////////////////////////
#include "Facade.h"
Facade::Facade()
{
m_SystemA = new SystemA();
m_SystemB = new SystemB();
m_SystemC = new SystemC();
}
Facade::~Facade()
{
delete m_SystemA;
delete m_SystemB;
delete m_SystemC;
}
void Facade::wrapOpration()
{
m_SystemA->operationA();
m_SystemB->operationB();
m_SystemC->opeartionC();
}
オブジェクト・モデルの外観を導入することによって、アクセスサブシステムは、それによって元のシステムの複雑さを低減する、単純かつ単一の入口を提供し、スケジューリングモジュールは、サブクラス、「デメテル」の結合を減少させます反射。仕事の様々なサブシステムの詳細については心配せずにメロディモジュールには、役割の出現によって、適切な関数を呼び出すことができます。
5.フライ級(Flaywight柄)
フライ級のパターンは、きめ細かいオブジェクトの再利用の共有、技術支援、大量の使用です。オブジェクトを複数回多重化することによって達成することができる、システムは、オブジェクトのほんの数を使用し、これらのオブジェクトは、状態の小さな変化に非常に類似しています。フライ級請求共有ためのオブジェクトがきめ細かいオブジェクトことができなければならないので、それは軽量モードと呼ばれます。
フライモード、コンテンツは、内部状態(固有状態)を共有することができ、それらの内容は、外部状態(外因性状態)と呼ばれる外部の環境を設定する必要性を共有することはできません。
フライ級は、4つのロールを含む:
(1)抽象メタクラスは、フライ級楽しむ
(2)としては、特にメタクラスConcreteFlyweight楽しむ
特に非共有メタクラスUnsharedConcreteFlyweightを楽しむ(3)
フライファクトリクラスFltyweightFactory(4)。
サンプルコード:
#include <iostream>
#include "ConcreteFlyweight.h"
#include "FlyweightFactory.h"
#include "Flyweight.h"
using namespace std;
int main(int argc, char *argv[])
{
FlyweightFactory factory;
Flyweight * fw = factory.getFlyweight("one");
fw->operation();
Flyweight * fw2 = factory.getFlyweight("two");
fw2->operation();
//aready exist in pool
Flyweight * fw3 = factory.getFlyweight("one");
fw3->operation();
return 0;
}
///////////////////////////////////////////////////////////
// FlyweightFactory.cpp
// Implementation of the Class FlyweightFactory
///////////////////////////////////////////////////////////
#include "FlyweightFactory.h"
#include "ConcreteFlyweight.h"
#include <iostream>
using namespace std;
FlyweightFactory::FlyweightFactory()
{
}
FlyweightFactory::~FlyweightFactory()
{
}
Flyweight* FlyweightFactory::getFlyweight(string str)
{
map<string,Flyweight*>::iterator itr = m_mpFlyweight.find(str);
if(itr == m_mpFlyweight.end())
{
Flyweight * fw = new ConcreteFlyweight(str);
m_mpFlyweight.insert(make_pair(str,fw));
return fw;
}
else
{
cout << "Aready in the pool,use the exist one:" << endl;
return itr->second;
}
}
///////////////////////////////////////////////////////////
// ConcreteFlyweight.h
// Definition of the Class ConcreteFlyweight
///////////////////////////////////////////////////////////
#ifndef __CONCRET_FLAYWEIGHT_H__
#define __CONCRET_FLAYWEIGHT_H__
#include "Flyweight.h"
#include <string>
using namespace std;
class ConcreteFlyweight : public Flyweight
{
public:
ConcreteFlyweight(string str);
virtual ~ConcreteFlyweight();
virtual void operation();
private:
string intrinsicState;
};
#endif
///////////////////////////////////////////////////////////
// ConcreteFlyweight.cpp
// Implementation of the Class ConcreteFlyweight
///////////////////////////////////////////////////////////
#include "ConcreteFlyweight.h"
#include <iostream>
using namespace std;
ConcreteFlyweight::ConcreteFlyweight(string str)
{
intrinsicState = str;
}
ConcreteFlyweight::~ConcreteFlyweight()
{
}
void ConcreteFlyweight::operation()
{
cout << "Flyweight[" << intrinsicState << "] do operation." << endl;
}
フライ通常のコードは、上記から同じ共有要素オブジェクトの内部状態を記憶するためのフライフライ級のプールを維持するために使用される植物を見ることができ、工場モードを生じます。ときにオブジェクトの必要性、プールが存在しない場合は、最初に新しいオブジェクトを作成し、プールフライ級、フライ級から取得は、ユーザフライ級、フライ級のプールに、新しいオブジェクト保存返されます。
6.エージェントモード(プロキシ・パターン)
ユーザーが望んでいないか、または直接オブジェクトを参照することができない場合は、「エージェント」と呼ばれるサードパーティのアプリケーションを介して間接的に達成することができます。実際のオブジェクトの動作は、新しいオブジェクトを導入することによって達成され、新しいオブジェクトが導入されるか、またはプロキシ・モードを実現するための機構である実オブジェクトの代替として。
プロキシモードでは、3つの役割が含まれます
(1)抽象的役割の件名
(2)働く役割プロキシ
(3)実際の役割をRealSubject
サンプルコード:
#include <iostream>
#include "RealSubject.h"
#include "Proxy.h"
using namespace std;
int main(int argc, char *argv[])
{
Proxy proxy;
proxy.request();
return 0;
}
///////////////////////////////////////////////////////////
// Proxy.h
// Definition of the Class Proxy
///////////////////////////////////////////////////////////
#ifndef __PROXY_H__
#define __PROXY_H__
#include "RealSubject.h"
#include "Subject.h"
class Proxy : public Subject
{
public:
Proxy();
virtual ~Proxy();
void request();
private:
void afterRequest();
void preRequest();
RealSubject *m_pRealSubject;
};
#endif
///////////////////////////////////////////////////////////
// Proxy.cpp
// Implementation of the Class Proxy
///////////////////////////////////////////////////////////
#include "Proxy.h"
#include <iostream>
using namespace std;
Proxy::Proxy()
{
m_pRealSubject = new RealSubject();
}
Proxy::~Proxy()
{
delete m_pRealSubject;
}
void Proxy::afterRequest()
{
cout << "Proxy::afterRequest" << endl;
}
void Proxy::preRequest()
{
cout << "Proxy::preRequest" << endl;
}
void Proxy::request()
{
preRequest();
m_pRealSubject->request();
afterRequest();
}
抽象的なテーマの役割本当のテーマとエージェントのテーマに共通のインターフェースを宣言し、実際の業務を達成するために、実際のトピックの役割;内部機関テーマ別の役割は、いつでも実際のテーマのオブジェクトを操作することができ、実際の対象への参照が含まれていました。ユーザーは、間接的な本物のテーマの役割で定義されたプロキシテーマ別ロールを介してメソッドを呼び出すことができます。薬剤を結合モードをある程度システムに減少させることができます。
共通エージェントは、次のとおりです。リモートエージェント、アラート、保護庁、ファイアウォール、インテリジェントエージェント、および他の参照します。