このエントリは、なんと最終回だというのに下書きのまま数ヶ月放置していて、私は公開済みであると勘違いしていたものです。。。ので、いろいろと忘れ去られているかと思いますが一応公開しておきます。(次のやる夫ネタを練りながらエントリいじってて発覚した)
←第20回
←第20回
やる夫のような天才プログラマは いつもクズSEに足を引っ張られて成功を掴み損ねるお。 ____ /_ノ ヽ_\ /( ●) ( ●)\ / ::::::⌒(__人__)⌒:::::\ |  ̄ | \ / コンポジットだかポンコジットだか知らないけど デザパタの勉強はクズSEに思想教育されてるみたいでヤダお! ノ L____ ⌒ \ / \ / (○) (○)\ / (__人__) \ | |::::::| | \ l;;;;;;l /l!| ! / `ー' \ |i / ヽ !l ヽi ( 丶- 、 しE |そ ドンッ!! `ー、_ノ ∑ l、E ノ < レY^V^ヽl いいかやる夫。これまで俺が教えてきた考え方は 素晴らしいプログラムの組み方というよりは作法だ。 つまり、プログラマ向けの躾みたいなもんだから お前がなっちゃいねーとこっちが恥かくんだボケ。 / ̄ ̄\ / _ノ \ | ( ●)(●) . | (__人__) | ` ⌒´ノ . | } . ヽ } ヽ ノ / く | \ | |ヽ、二⌒) ドシー!悪口でおいらの心が折れる前に とっととポンコジットパターンを教えるお! ____ /_ノ ' ヽ_\ /(≡) (≡)\ / /// (__人__) ///\ | |r┬-| | \ ` ー'´ / いいだろう。 / ̄ ̄\ / \ |:::::: | . |::::::::::: | |:::::::::::::: | ....,:::´, . . |:::::::::::::: } ....:::,, .. . ヽ:::::::::::::: } ,):::::::ノ . ヽ:::::::::: ノ (:::::ソ: . /:::::::::::: く ,ふ´.. -―――――|:::::::::::::::: \ -―,――ノ::ノ―― |:::::::::::::::|ヽ、二⌒)━~~'´
前回の話から例えて話すと、あるコレクション―――たとえば魔法コレクションの中にさらにコレクションを保持したとしても、扱い(型)を変えることなく利用できる構造をコンポジットパターンといいます。
・・・ということだ。
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
?
|:;:;:;;:;:;:;:;:i;:;::::;:;|
|;:;:_:_;:;_:;:l:;_:_;:_;|
|___|__|
/ ・ ・ \
/ (●) (●) \
| (__人__) |
\________/
/|├┤├┤|\
(理解してんだかしてねーんだか
わかんねぇリアクションは頼むからやめてくれ)
・・・・・・・。
/ ̄ ̄\
/ _ノ \
| ( ○)(○)
. | u (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
ディレクトリ構造だってことは理解したお
おいらのお宝ディレクトリへのパスは頭に
たたきこんであるお。
どこにいようと相対パスで手繰れるほどだお。
ディレクトリ構造は得意だお。
____
/ \
/ ─ ─\
/ (●) (●) \
| (__人__) | ________
\ ` ⌒´ ,/ .| | |
ノ \ | | |
/´ | | |
| l | | |
ヽ -一ー_~、⌒)^),-、 | |_________|
ヽ ____,ノγ⌒ヽ)ニニ- ̄ | | |
把握したなら
それを踏まえてコードを書いてみろ。
/ ̄ ̄\
/ \
|:::::: |
. |::::::::::: |
|:::::::::::::: | ....,:::´, .
. |:::::::::::::: } ....:::,, ..
. ヽ:::::::::::::: } ,):::::::ノ .
ヽ:::::::::: ノ (:::::ソ: .
/:::::::::::: く ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
|:::::::::::::::|ヽ、二⌒)━~~'´
// まず抽象コンポーネントを用意するお
public abstract class YaruoComponent {
// 操作の定義 追加・削除・子ノードの取得
public void add( YaruoComponent param ){}
public void remove( YaruoComponent param ){}
public YaruoComponent getChild( int idx ){}
// ビジネスロジック定義
public String getName(){}
public String getDescription(){}
public double getEffectiveValue(){}
public void print(){}
}
// アビリティ1つを表現する
public class AbilityItem extends YaruoComponent {
String name; // アビリティ名
String description; // 説明
double effectiveValue; // アビリティ効果値
public AbilityItem( String name, String description, double effectiveValue ){
this.name = name;
this.description = description;
this.effectiveValue = effectiveValue;
}
// ビジネスロジックのオーバーライド
public String getName(){ return name; }
public String getDescription(){ return description; }
public double getEffectiveValue(){ return effectiveValue; }
public void print(){
System.out.println( getName() );
System.out.println( getDescription() );
System.out.println( getEffectiveValue() );
}
}
// アビリティコレクションを表現する
public class AbilityCollection extends YaruoComponent {
ArrayList abilityComponents = new ArrayList();
String name; // アビリティ名
String description; // 説明
public AbilityCollection( String name, String description ){
this.name = name;
this.description = description;
}
public void add( YaruoComponent param ){
abilityComponents.add( param );
}
public void remove( YaruoComponent param ){
abilityComponents.remove( param );
}
public YaruoComponent getChild( int idx ){
return (YaruoComponent)abilityComponents.get( idx );
}
// ビジネスロジックのオーバーライド
public String getName(){ return name; }
public String getDescription(){ return description; }
public void print(){
System.out.println( getName() );
System.out.println( getDescription() );
}
}
___
/ ⌒ ⌒\ ざっとこんなもんだお
/ (⌒) (⌒) \
/ ///(__人__)/// \
| `Y⌒y'´ | ________
\ ゙ー ′ ,/ | | |
ノ \ | | |
/´ | | |
| l | | |
ヽ -一ー_~、⌒)^),-、 | |________|
ヽ ____,ノγ⌒ヽ)ニニ-  ̄ | | |
これでアビリティ内アビリティを延々と
表現できるでおJAL
|:;:;:;;:;:;:;:;:i;:;::::;:;|
|;:;:_:_;:;_:;:l:;_:_;:_;|
|___|__|
/ ・ ・ \
/ (●) (●) \
| (__人__) |
\________/
/|├┤├┤|\
(なんだこの自由すぎるキャラは)
そのとおりだ。おおむね間違っていないが、
前回学んだイテレータが生かされてないのと
AbilityItemがノードの操作をできてしまうから
抽象クラスでは例外を投げるようにするのが普通だ。
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | }
. ヽ }
ヽ ノ
/ く
| \
| |ヽ、二⌒)
public abstract class YaruoComponent {
// 操作の定義 追加・削除・子ノードの取得
public void add( YaruoComponent param ){
throw new UnsupportedOperationException();
}
// 以下のメソッドに例外を埋め込んでく
}
// アビリティコレクションを表現する
public class AbilityCollection extends YaruoComponent {
ArrayList abilityComponents = new ArrayList();
// 中略
public void print(){
System.out.println( getName() );
System.out.println( getDescription() );
// イテレータで実装
Iterator itr = abilityComponents.iterator();
while( itr.hasNext() ){
YaruoComponent ability = (YaruoComponent)itr.next();
ability.print();
}
}
}
これでどうかお。完璧すぎてこわいお。
____
/⌒ ⌒\
. /( ―) (―)\ ふん、ふーん。
/ ::::::⌒(__人__)⌒::::: \ ふ、んー。
| |r┬-| |
\ `ー'´ /
ノ \
/´ ヽ カ
| l l||l 从人 l||l l||l 从人 l||l カ タ
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. タ
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄
そのとおりだ。
これで俺からのデザパタ講義は完了だ。
ほかにも教えなきゃいかんことがたくさんあるが
しばらく一人でやってみろ。
/ ̄ ̄\
/ \
|:::::: |
. |::::::::::: |
|:::::::::::::: | ....,:::´, .
. |:::::::::::::: } ....:::,, ..
. ヽ:::::::::::::: } ,):::::::ノ .
ヽ:::::::::: ノ (:::::ソ: .
/:::::::::::: く ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
|:::::::::::::::|ヽ、二⌒)━~~'´
やる夫はまだまだ知りたいことがたくさんあるお
次は暗号技術について知りたいから
やる夫で学ぶシリーズかけるくらいになっとけお。
____
/⌒ ⌒\
/( ―) (―)\
/::::::⌒(__人__)⌒::::: \
| |
\ /
っっっっ!!
___
/ \ ___
/ノし u; \ ;/(>)^ ヽ\; あぶぶ
| ⌒ ) ;/ (_ (<) \;
| 、 );/ /rェヾ__)⌒::: ヾ;
| ^ | i `⌒´-'´ u; ノ;;
| | \ヽ 、 , /;
| ;j |/ \-^^n ∠ ヾ、
\ / ! 、 / ̄~ノ __/ i;
/ ⌒ヽ ヽ二) /(⌒ ノ
/ r、 \ / ./  ̄ ̄ ̄/
ということでやる夫で学ぶデザインパターンは終了です。ありがとうございました!私はやる夫がすきなのでまたテケトーに技術関連のエントリを書く事があるかと思いますのでそのときはまた読みにきて頂けると嬉しいです。
ほいたらそのときはまたよろしくお願いします。
ほいたらそのときはまたよろしくお願いします。


