圧倒亭グランパのブログ

30年後の自分にもわかるように書くブログ

イメージ図で覚えるデザインパターンまとめ 01. Iterator 〜 03. TemplateMethod

今まで、デザインパターンにはちょくちょく触れてきましたが、あまり理解できていませんでした。

ふわっとしたイメージだけあって、実際のコードに落としこめていませんでした。

そこで、「実務で使えるように理解しよう!」と思い、勉強し始めました。

そうしてできたものが、以下の記事です。

デザインパターンから学ぶオブジェクト指向 【01. Iterator】 - 圧倒亭グランパのブログ

 

デザインパターンから学ぶオブジェクト指向 【02. Adapter】 - 圧倒亭グランパのブログ

 

ですが、このスライドではまだ情報量が多く頭に定着していません。

なので、

  「より情報量を少なくし、パッと頭で思い浮かべられて、仕事で使えるようにしよう」

というコンセプトでもう一度まとめてみました。

記憶力がないので、できるだけ最小限の情報にとどめています。

また、自分はイメージ記憶のほうが好きなので、オレオレイメージ図でまとめています。

 

基本構成は以下です。

1.このパターンは何をするものか
2.イメージ図
3.実務で使える学び
4.コード

 

「イメージ図」「実務で使える学び」だけ覚えておけばいいかなーと思います。

イメージ図は一般的なクラス図を無視しているので、正しいクラス図は他のサイトを参考にしてください。

また、「実装できること」が目的なので、図はちょっと複雑かもしれません。

「図を思い出したらすぐにコードも思い出せる」を目指しています。

 

今回は 01.Iterator 〜 03.TemplateMethod です。

 

※ ナンバリングはこちらのサイトを参考にさせていただきました

デザインパターン | TECHSCORE(テックスコア)

 

01. Iterator

何をするものか

データの集まりに対して、様々なアクセス方法を実現する。

イメージ図

f:id:at_grandpa:20150215140808p:plain

① Aggregater(集約体)、Iterator、MainClassに分離する
IteratorIterator interface を実装する
  ・これにより、MainClassを書き換えずにIteratorの切替が可能

実務で使える学び

  • データの集まりとデータ処理を分離させる
    • メインの処理を変更せずに、データの集まりやデータ処理を切替・修正できる
    • テストも書きやすい

コード

順方向と逆方向に走査するパターンを例として挙げています。

https://github.com/at-grandpa/design_pattern/tree/master/01.Iterator

https://github.com/at-grandpa/design_pattern/tree/master/01.Iterator

 

02. Adapter

何をするものか

インターフェース(この場合メソッド名や呼び出し元)の異なるクラスを接続する。

イメージ図

f:id:at_grandpa:20150215141120p:plain

① 変更不可なClassBを、ClassAの代わりに使いたい
② ClassAと同じInterfaceを持つAdapterを作成する
③ MainClassを変更せずに、ClassBのoriginal_method()を呼ぶことができる

実務で使える学び

  • 既存コードを変更せずに、機能を使いまわすことができる
    • ちょっとした変換処理もAdapterに持たせると、より柔軟に対応できるかも

コード

各国の挨拶を例に、Adapterパターンを実装しています(こういう例は難しいですが...)

https://github.com/at-grandpa/design_pattern/tree/master/02.Adapter

https://github.com/at-grandpa/design_pattern/tree/master/02.Adapter

 

03. TemplateMethod

何をするものか

大枠の処理をスーパークラスにて共通化(TemplateMethodに記述)し、具体的な処理をサブクラスに任せる。

イメージ図

f:id:at_grandpa:20150215154331p:plain

① 大枠の処理をSuperClassのTemplateMethodに記述する
② 大枠の処理の中のMethodを抽象メソッドにする
③ 抽象メソッドの具体的な処理は各SubClassに任せる

実務で使える学び

  • 大枠の処理を変更せずに、微妙に異なるクラスを簡単に作成できる
    • 処理内容は既に書かれているので、異なる部分だけ記述すればOK
  • 大枠の処理の修正が簡単
    • SuperClassのTemplateMethodを書き換えるだけで、全てのSubClassの処理を修正できる
    • もし各SubClassそれぞれに似たような処理が書かれていた場合、全て修正しなければならなく、つらい。。。

コード

File入力と標準入力を例に、TemplateMethodパターンを実装しています。

https://github.com/at-grandpa/design_pattern/tree/master/03.TemplateMethod

https://github.com/at-grandpa/design_pattern/tree/master/03.TemplateMethod

 

今回はここまで

今回は01. iterator 〜 03. template まででした。

次回は04.FactoryMethodから。

 

逆にわかりにくい!などのご意見があれば、コメントやブクマコメント、Twitterにてご連絡ください。