構造に関する GoF (Gang of Four) パターンは、クラスとオブジェクトを組み合わせることによってより大きな構造を形成するための方法を扱います。構造に関するクラスパターンは、継承を使用してインタフェースや実装を構成します。たとえば、複数の継承は、1 つのクラスに複数の親クラスが混在する可能性があることを意味します。複数の継承を使用すれば、別個に作成されたクラスライブラリを容易に組み合わせて使用することができます。
次の表で構造に関する GoF パターンについて説明します。
| パターン名 | 対応する設計上の問題 | ロール | 説明 |
|---|---|---|---|
| Adapter | クラスのインタフェースを、クライアントが求めるインタフェースに変換します。Adapter を使用すると、インタフェースに互換性のないクラスを組み合わせて使用できます。 | Target | 特定の要求を取得するためにクライアントによって使用される一連の操作を定義します。 |
| Client | Target オブジェクトを操作します。 | ||
| Adaptee | 特定の要求に使用できる特定の適合を定義します。 | ||
| Adapter | 特定の Target 要求と特定の Adaptee 間の接合点を提供し、そこで実際に要求を処理します。 | ||
| Bridge | 特定の動作に固有の実装を変更できる抽象機構を提供します。 | Abstraction | RefinedAbstraction によって実装される抽象インタフェースを定義します。 |
| RefinedAbstraction | Abstraction インタフェースに宣言された操作を実装します。 | ||
| Implementor | ConcreteImplementor によって実装される抽象インタフェースを定義します。Abstraction は Implementor を使用します。 | ||
| ConcreteImplementor | Implementor インタフェースに宣言された操作を実装します。 | ||
| Composite | Composite を使用すると、ほかのオブジェクトを含むことができるオブジェクトを均一に操作できます。 | Component | コンポジションに属するためにすべてのオブジェクトが実装する必要がある基本的なインタフェースを定義します。 |
| Leaf | コンポジションに関連するオブジェクトが含まれていないオブジェクトです。 | ||
| Composite | Component インタフェースに準拠するほかのオブジェクトを含むオブジェクトです。 | ||
| Client | Component オブジェクトを操作します。 | ||
| Decorator | オブジェクトに責任を動的に追加します。Decorator はサブクラス化よりも柔軟な方法で機能を拡張します。 | Component | 動的に装飾するすべてのオブジェクトに実装する必要がある抽象インタフェースを定義します。 |
| ConcreteComponent | Component インタフェースに宣言された操作を実装します。 | ||
| Decorator | ConcreteDecorators によって実装される抽象インタフェースです。 | ||
| ConcreteDecorator | Decorator インタフェースに宣言された操作を実装します。 | ||
| Facade | 潜在的に複雑なサブシステムへの上位レベルの入場点を提供し、クライアントからのサブシステム管理を容易にします。 | Facade | 要求を委任するオブジェクトです。 |
| Subsystem | Facade オブジェクトによって委譲された特定の要求を実装します。 | ||
| Flyweight | 細分された多数のオブジェクトを効率的にサポートするために共有が使用されます。 | Flyweight | ConcreteFlyweight 間で共有できない状態を操作するためにクライアントが使用する抽象インタフェースを定義します。 |
| ConcreteFlyweight | Flyweight インタフェースを実装します。また、共有できる状態の格納場所を提供します。 | ||
| UnsharedConcreteFlyweight | Flyweight インタフェースを実装します。また、共有できない状態の格納場所を提供します。 | ||
| FlyweightFactory | ConcreteFlyweight オブジェクトを作成する操作を提供します。 | ||
| Client | Flyweight オブジェクトを操作します。 | ||
| Proxy | 別のオブジェクトの代理または代替文字を提供し、オブジェクトへのアクセスを管理します。 | Proxy | Subject によって定義されるインタフェースを実装し、次にそのインタフェースを通じて RealSubject にすべての要求を渡します。 |
| Subject | RealSubject および Proxy に実装する必要がある一連の操作を定義します。 |