気になる技術的なことについて少しずつ書いていけたらと思っております。デザインパターン」を参考にしながら書いています。鴨シミュレータを作成するために今まで習った様々なデザインパターンを適用してきました。前回の最後はAbstractFactoryパターンを適用し、鴨の鳴き声のカウンティングを行うクラスの生成をFactoryに集中させました。これによって毎回DecoratorのQuackCounterクラスの生成を記述する必要がなくなり、クラスの生成に関する変更に対して柔軟にすることが出来ます。Iterator/Compositeパターン現在のシミュレータの以下のコードを見て下さい。生成とシミュレーションの処理が繰り返しで行われており、これではクラスが増えた時に面倒です。ここでCompositeデザインパターンを使ってみましょう。Compositeパターンはオブジェクトの集合を単体のオブジェクトとして扱うことが可能にするパターンです。}}Compositeパターンを使用したクラスを作成しました。後はこれをDuckSimulatorクラスに適用していきます。}}これにより、鴨のシミュレーションが呼び出し一つで行えるようになりました。追加の記述が面倒、これなら普通にsimulate()を複数書いたほうが短くないか?という疑問もあるでしょう。この鴨の呼び出しが何度も行われるようなケースではCompositeパターンを使うことでもコードの記述量も減り、使いやすいコードにすることが出来るでしょう。Observerパターンどうやら新しい要求が来たようで、逆に個々の鴨も管理の対象に置きたいようで、鴨が鳴いた瞬間を知りたいそうです。とある動作をした時に、その動作をしたことを知るパターン。ここでObserverパターンの使い所です。Observerableという監視対象に適応したいインターフェースを作成します。notifyObservers();}次にQuackableにこのインターフェースを継承します。quack();}QuackableにQuackObservableを追加した事により、Quackableインターフェースを実装しているクラスは、registerObserver()とnotifyObservers()の具体的な処理を記述する必要性が出てきました。すべてのクラスに詳細な処理を記述しているのは非常に手間がかかり、処理も重複する可能性があります。ここでは、Observableというヘルパークラスを作成することにより、他のクラスにコンポジションすることで実際の処理を一度記述するだけでよくなります。実際にObservableクラスを見て行きましょう。}}コンストラクタの部分で実体のQuackObservableを保持することで、このクラスに処理を集中させることが出来るのがわかると思います。*2実際のコードを見て、Observableがどのように使われるか見てみましょう。}}registerObserver()・notifyObservers()の処理を受け取った時、Observableにその処理を流しているのがわかると思います。処理を委譲しているんですね。duck);}次にこのクラスの具象クラスが必要になるので、Quackologistというクラスを作成します。}}さて、Observerが完成したので、実際に鴨シミュレータでどのように動作するかを見てみましょう。simulate関数の中身を抜粋して書いていきます。Quackologist();flockOfDucks.registerObserver(quackologist);simulate(flockOfDucks);Observerを作ってflockOfDucksに監視者として登録させているだけです。ここで驚きなのは、flockOfDuckというCompositeに登録するだけですべての鴨を監視できていることです。Compositeを使わなければ、ここで沢山registerObserverを書かなければいけなかったことを考えると、かなり処理が簡略化しているのが伺えますね!次回Adapterガチョウも鴨と同様に扱えるようにしたDecorator鴨の鳴き声を数えられる機能を追加したFactory(AbstractFactory)インスタンスの生成を一元して管理するようにしたComposite繰り返しの処理をグループ管理したObserver処理を監視したこれらのパターンを順々に適応していった。このような感じでデザインパターンを複雑に組み合わせることで、シンプルなコードが出来上がります!自分もこんな風にデザインパターンを利用出来るようにしたいですね。これはまだCompoundパターンでは無いみたいなのです!この本で触れるCompoundパターンとは我々、Webエンジニアがよく触るMVCを例にして紹介しています!次回はMVCについて触れて始めていくよ!*1:自分はinterfaceにinterfaceがextends出来るということをよくわかっていなかったので、最初にこれを見た時は非常に混乱しました*2:この書き方、ちょっとDecoratorっぽいですね。02:14【デザインパターン】コンパウンドパターン【事前学習編2】Tweet広告を非表示にする関連記事2014-12-26【デザインパターン】デザインパターンの振り返り【後篇】どうも、こんばんわ。ジャーナルと戯れています。研究とプライベートで予定も中々ヒートアップしてまいりました。React・Reduxの導入からサーバーサイドレンダリングによるUXの向上まで【書評】現場で役立つシステム設計の原則~変更を楽で安全にするオブジェクト指向の実践技法isucon9予選で赤い彗星になれず予選落ちしました月別アーカイブ参加グループ焼き肉ブログはてなブログをはじめよう!dorivenさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。