|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ
|
Decoratorパターン (デザインパターン)
Decoratorパターン 導入
Decoratorパターンは、委譲を活用して振る舞いを装飾(拡張)するパターンです。 部品は装飾されることを前提として考えます。具象装飾部品と装飾者の抽象部品のクラスを設定することで
操作に関する共通のインターフェースを定義します。装飾者は部品を保持し、 装飾部品に関する操作(Operation)を各具象装飾者で再定義する形になります。
Decoratorパターン ポイント
機能の拡張に関して、継承で対応しようとすれば機能拡張を行う数だけのクラスが必要になります。 ケーキの装飾を考えた場合、(下記のような組み合わせが考えられます。)
- 継承によってクラス定義をする。
- カステラを敷く
- クリームを塗る
- ネームプレートをつける
- カステラを敷く+クリームを塗る
- カステラを敷く+ネームプレートをつける
- クリームを塗る++ネームプレートをつける
- カステラを敷く+クリームを塗る+ネームプレートをつける
装飾の順番まで含めて管理しようとなると、数がさらに多くなります。 Decoratorパターンでは拡張する機能の一つ一つが独立したクラスになっており、実行時には
装飾者の組み合わせで対応することが出来ます。
UML Decoratorパターン
C#ソースコード Decoratorパターン
|
Sample.cs
|
|
using System;
namespace Decorator
{
public abstract
class Component
{
public
abstract void Operation();
}
public class
ConcreteComponent_Kasutera : Component
{
public
override void Operation()
{
Console.WriteLine("実装部品基底の操作:スポンジケーキ(カステラ)を敷き詰めます!");
}
}
public abstract
class Decorator :Component
{
private Component
comp;
public Component SetComponent
{
set{this.comp=value;}
get{return this.comp;}
}
public
override void Operation()
{
if(this.comp
!=null)
{
comp.Operation();
}
}
}
public class
ConcreteDecorator_Shimizu :Decorator
{
private
string strAddedState;
public
string AddState
{
get{return this.strAddedState;}
}
public
override void Operation()
{
base.Operation();
strAddedState ="Cream しました!";
Console.WriteLine("清水飾り:クリームでデコレーションしました");
}
}
public class
ConcreteDecorator_Michiba :Decorator
{
private
string strBirthDayName=null;
public
string BirthDayName
{
set{this.strBirthDayName=value;}
}
public
override void Operation()
{
base.Operation();
AddedBehavior_BirthDay();
Console.WriteLine("道場飾り:最後に、フルーツを盛り付けます。");
}
private
void AddedBehavior_BirthDay()
{
if
(this.strBirthDayName
!=null)
{
Console.WriteLine("道場飾り:ネームプレート付けました :"
+
strBirthDayName
+ "さん、おめでとう!");
}
}
}
class Class1
{
[STAThread]
static
void Main(string[] args)
{
ConcreteComponent_Kasutera Kasutera =new ConcreteComponent_Kasutera();
ConcreteDecorator_Shimizu Shimizu
=new ConcreteDecorator_Shimizu();
ConcreteDecorator_Michiba Michiba
=new ConcreteDecorator_Michiba();
Shimizu.SetComponent=Kasutera;
Michiba.BirthDayName="ひでお";
Michiba.SetComponent=Shimizu;
Michiba.Operation();
}
}
}
|
Decorator 実行結果
UMLプラグインによる描画 Decoratorパターン
Javaソースコード Decoratorパターン
| Component.java |
1: package decorator;
2:
3: public abstract class Component {
4:
5: public abstract void operation();
6:
7: }
|
| ConcreteComponent_Kasutera.java |
1: package decorator;
2:
3: public class ConcreteComponent_Kasutera extends Component {
4:
5: //この部品は操作のインターフェースを実装します。
6: public void operation() {
7: System.out.println("スポンジとして、底に薄く敷き詰めます。");
8: }
9:
10: }
|
| Decorator.java |
1: package decorator;
2:
3: public abstract class Decorator extends Component {
4:
5:
6: private Component component;
7:
8: //ここには装飾者共通の操作があるときに使用します。
9: //何も無い場合は、abstractでもいいですね。
10: public void operation() {
11: //例)実装はコンポーネントの操作があるときは
12: //実行するようにします。
13: if (this.component !=null){
14: this.component.operation();
15: }
16: }
17:
18: public Component getComponent() {
19: return component;
20: }
21: //具象部品がセットされます。
22: public void setComponent(Component component) {
23: this.component = component;
24: }
25:
26: }
|
| ConcreteDecorator_Michiba.java |
1: package decorator;
2:
3: public class ConcreteDecorator_Michiba extends Decorator {
4:
5: private String BirthDayName;
6:
7: public void operation() {
8: //必要に応じて実装します。
9: super.operation();
10:
11: //追加操作
12: addedBehavior_BirthDay();
13: System.out.println("道場飾り:最後にフルーツを盛りました。");
14: }
15:
16: //helperメソッド
17: private void addedBehavior_BirthDay() {
18:
19: if(this.BirthDayName !=null)
20: {
21: System.out.println("道場飾り:ネームプレートをつけました\n"
22: + BirthDayName +"さん、誕生日おめでとう!");
23: }
24: }
25:
26: public void setBirthDayName(String BirthDayName) {
27: this.BirthDayName = BirthDayName;
28: }
29:
30: }
|
| ConcreteDecorator_Shimizu.java |
1: package decorator;
2:
3: public class ConcreteDecorator_Shimizu extends Decorator {
4:
5: private String addState;
6:
7: public void operation() {
8: //Derectorクラスで定義された操作を行います。
9: super.operation();
10: //状態を記録します。
11: this.setAddState("Creamしました!");
12: System.out.println("清水飾り:クリームでデコレーションしました。");
13: }
14:
15: public String getAddState() {
16: return addState;
17: }
18:
19: public void setAddState(String addState) {
20: this.addState = addState;
21: }
22:
23: }
|
| StartClass.java |
1: package decorator;
2:
3: public class StartClass {
4:
5: public static void main(String[] args) {
6:
7: //具象部品のインスタンス作成
8: ConcreteComponent_Kasutera kasutera =new ConcreteComponent_Kasutera();
9:
10: //具象装飾者のインスタンス作成
11: ConcreteDecorator_Shimizu shimizu =new ConcreteDecorator_Shimizu();
12: ConcreteDecorator_Michiba michiba =new ConcreteDecorator_Michiba();
13:
14: //具象部品を装飾者にセットします。
15: shimizu.setComponent(kasutera);
16:
17:
18: //動作を確認します。(開始)
19: //michiba.setComponent(kasutera);
20: //shimizu.operation();
21: //michiba.operation();
22: //動作を確認します。(終了)
23:
24: //バースデイネームをセットします。
25: michiba.setBirthDayName("ひでお");
26: //Componentクラスを継承させているので、具象装飾者に対して
27: //具象部品だけでなく装飾者のインスタンスを渡すことも可能です。
28: //これにより柔軟な付加機能追加を拡張できます。
29: michiba.setComponent(shimizu);
30: michiba.operation();
31:
32: }
33: }
|
デザインパターン「ひとくちメモ」へ
Homeへもどる
|
|
| お天気情報 |
|
東京都 東京 - 今日の天気
|
曇り
-
|
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
東京都 東京 - 明日の天気
|
晴のち雨
-
|
|
|
最高
|
最低
|
| 気温
|
9 |
3 |
| 湿度
|
48.2 |
37.4 |
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
東京都 東京 - あさっての天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
11 |
4 |
| 湿度
|
51.8 |
39.2 |
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
大阪府 大阪 - 今日の天気
|
晴のち曇
-
|
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
大阪府 大阪 - 明日の天気
|
雨
-
|
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
大阪府 大阪 - あさっての天気
|
曇時々晴
-
|
|
|
最高
|
最低
|
| 気温
|
7 |
3 |
| 湿度
|
44.6 |
37.4 |
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
| livedoorのWebサービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|