Decorator パターン

Decorator パターン（デコレータ・パターン）とは、GoF（Gang of Four; 4人のギャングたち）によって定義されたデザインパターンの1つである。 このパターンは、既存のオブジェクトに新しい機能や振る舞いを動的に追加することを可能にする。

## クラス図

[編集]

Decorator パターンのクラス図を以下に挙げる。

## 概要

[編集]

Decorator パターンの方針は、既存のオブジェクトを新しい `Decorator` オブジェクトでラップすることである。 その方法として、`Decorator` のコンストラクタの引数でラップ対象の `Component` オブジェクトを読み込み、コンストラクタの内部でそのオブジェクトをメンバに設定することが一般的である。

Decorator パターンは、既存のクラスを拡張する際にクラスの継承の代替手段として用いられる。継承がコンパイル時に機能を拡張するのに対し、Decorator パターンはプログラムの実行時に機能追加をする点が異なる。

この節の加筆が望まれています。

|

## 利用例

[編集]

Java による利用例を以下に挙げる。

/** 価格をあらわすインタフェース */
interface Price{
int getValue();

/** 原価を表すクラス */
class PrimePrice implements Price{
private int value;
PrimePrice(int value){
this.value = value;

public int getValue(){
return this.value;

/** マージンを介する価格 */
abstract class MarginPrice implements Price{
protected Price originalPrice;
MarginPrice(Price price){
this.originalPrice = price;

/** 設定された利益を仕入れ価格に上乗せする Price */
class WholesalePrice extends MarginPrice{
private int advantage;
WholesalePrice(Price price, int advantage){
super(price);
this.advantage = advantage;

public int getValue(){
return this.originalPrice.getValue() + advantage;

/** 仕入れ価格の 2 倍の値段を提示する Price */
class DoublePrice extends MarginPrice{
DoublePrice(Price price){
super(price);

public int getValue(){
return this.originalPrice.getValue() * 2;

public class DecoratorTest{
public static void main(String[] argv){
System.out.println(
new WholesalePrice(
new DoublePrice(
new WholesalePrice(
new DoublePrice(
new PrimePrice(120)

,80

,200

.getValue()

クラス図との関連は以下の通りである。

Component
`Price`
ConcreteComponent
`PrimePrice`
Decorator
`MarginPrice`
ConcreteDecorator
`WholesalePrice`, `DoublePrice`

## 関連項目

[編集]

* デザインパターン
* Adapter パターン
* Abstract Factory パターン
* Composite パターン
* イミュータブル

* 表
* 話
* 編
* 歴

デザインパターン

GoFによる23種のパターン|

| 生成に関するパターン|

* Abstract factory
* Builder
* Factory method
* Prototype
* Singleton

|

構造に関するパターン|

* Adapter
* Bridge
* Composite
* Decorator
* Facade
* Flyweight
* Proxy

振る舞いに関するパターン|

* Chain of responsibility
* Command
* Interpreter
* Iterator
* Mediator
* Memento
* Observer
* State
* Strategy
* Template method
* Visitor

並行性に関するパターン|

* Active object（英語版）
* Balking（英語版）
* Double-checked locking（英語版）
* Event-based asynchronous（英語版）
* Guarded suspension（英語版）
* Join（英語版）
* ロック
* モニタ
* Proactor（英語版）
* Reactor
* Readers–writer lock（英語版）
* Scheduler（英語版）
* Thread pool（英語版）
* スレッド局所記憶

アーキテクチャに関するパターン|

* Front Controller（英語版）
* Interceptor（英語版）
* MVC
* MVVM
* 多層アーキテクチャ
* Specification（英語版）
* 出版-購読型モデル
* Naked objects（英語版）
* Service Locator（英語版）
* Active Record
* Identity map（英語版）
* Data Access Object
* Data Transfer Object

その他のパターン|

* 依存性の注入 (DI)
* 遅延読み込み
* モックオブジェクト
* Null object（英語版）
* Object pool（英語版）
* Servant（英語版）
* Type tunnel（英語版）

関連する人々|

* ギャング・オブ・フォー
* エーリヒ・ガンマ
* リチャード・ヘルム
* ラルフ・ジョンソン
* ジョン・ブリシディース
* クリストファー・アレグザンダー
* グラディ・ブーチ
* ケント・ベック
* ウォード・カニンガム
* マーティン・ファウラー
* ロバート・セシル・マーティン（英語版）
* ジム・コプリエン（英語版）
* ダグラス・C. シュミット（英語版）
* リンダ・ライジング（英語版）

関連項目|

* アナリシスパターン
* アンチパターン

* 一覧
* カテゴリ
* コモンズ