http://www.ruby-lang.org/ja/man/?cmd=view;name=Observable ActiveRecordのソース読んでて、Observerパターンのところでinclude Observableとmix-inしててなんじゃこりゃって思ったので調べたら、標準添付ライブラリでこんなんあったのねー。 つーことで結城さんのJava言語で学ぶデザインパターン入門のObserverパターンのサンプルをObservableを使って実装してみた。 #!/usr/bin/env ruby require 'observer' class RandomNumberGenerator include Observable attr_reader :number def execute 20.times do @number = rand 50 self.changed noti
結城さんのデザパタMLでも紹介されてしまった手前、さぼるわけにもいくまい、ということで「機能の階層と実装の階層を分ける」 Bridge パターンです。 使いどころはたくさんありそうでなさそうでありそうな(どっちだ)、個人的には結構好きなパターンです。プログラムを拡張するには、クラスを追加するわけですが、あらかじめ「機能」を追加するのか、「実装」を追加するのかという視点で二つの階層に分けて実装しておくことで、拡張しやすい構成にしましょうというパターンです。 +-------------+ |Hello, Japan.| +-------------+ +-------------+ |Hello, World.| +-------------+ +----------------+ |Hello, Universe.| +----------------+こんな感じの出力を作りたい場合、まず
7つめは、「複雑なインスタンスを組み立てる」Builder パターンです。 var Main = Class.create(); Main.prototype = { initialize : function () {}, main : function () { var builder; if (arguments[0] == 'plain') builder = new TextBuilder(); else builder = new HTMLBuilder(); director = new Director(builder); director.construct(); document.writeln(builder.getResult()); } } というクライアントがあり、その出力は引数が plain なら ============================ 『G
ようやく8つめ。まだ残り 15 あります。8つめは「関連する部品を組み合わせて製品を作る」Abstract Factory パターン。複数のオブジェクトを正しい組み合わせで生成されるようにしたい、といったときに使うパターンです。 デザパタ本の題材は階層構造を持ったリンク集ページを作る、というものですね。 LinkPage * 新聞 o 朝日新聞 o 読売新聞 * サーチエンジン o Yahoo! + Yahoo! + Yahoo! Japan o Excite o Google -- 伊藤 直也こんな感じの出力を HTML で出してみましょう、というもの。 集合を扱う Tray クラスと、各個別のリンクを扱う Link クラスを用意してそのインスタンスを操作しページに相当する Page クラスに追加していくことでこの出力を作ります。ただ、出力は ul/li によるリスト構造による出力とか
続きまして「コピーしてインスタンスを作る」Prototype パターンです。デザパタ本では6章にあたります。 var Main = Class.create(); Main.prototype = { initialize : function () {}, main : function() { var manager = new Manager(); var upen = new UnderlinePen('~'); var mbox = new MessageBox('*'); var sbox = new MessageBox('/'); manager.register("strong message", upen); manager.register("warning box", mbox); manager.register("slash box", sbox); docum
次は「たった1つのインスタンス」Singleton パターンです。あるクラスがあって、そのクラスのインスタンスは実行アプリケーションのライフサイクルを通じて唯一に制限したい、何回生成しても同じインスタンスである、というものです。 var Main = Class.create(); Main.prototype = { initialize : function() {}, main : function() { document.writeln('Start.<br>'); var obj1 = Singleton.getInstance(); var obj2 = Singleton.getInstance(); if (obj1 == obj2) { document.writeln('obj1 と obj2 は同じインスタンスです。<br>'); } else { document
次は「具体的な処理をサブクラスにまかせる」Template Method パターン。定番ですね。 var Main = Class.create(); Main.prototype = { initialize : function () {}, main : function () { var d1 = new CharDisplay('H'); var d2 = new StringDisplay('Hello, world.'); var d3 = new StringDisplay('Oh! JavaScript'); d1.display(); d2.display(); d3.display(); } } みたいなクライアントがあります。出力結果として、 [[HHHHH]] +-------------+ |Hello, world.| |Hello, world.| |Hel
Iterator に続きまして、「一皮かぶせて再利用」な Adapter パターンです。クライアントは var Main = Class.create(); Main.prototype = { initialize : function() {}, main : function () { var p = new PrintBanner("Hello, World"); p.printWeak(); document.writeln('<br>'); p.printStrong(); } } といった感じ。PrintBanner クラスは別のレガシーなクラスのアダプタで、インタフェースを肩代わりしてやっていると。 実行結果は (Hello, World) *Hello, World*となります。 今回もやっぱり interface に相当するものは作らずにやってみます。(Adapter
Ruby on Rails や Catalyst のプラグインなんかでは prototype.js という JavaScript のライブラリを使って、Ajax サポートを実現しています。prototype.js とフレームワークが必要な Ajax の JavaScript コードを吐き出してくれるので、Ruby プログラマや Perl プログラマは JavaScript の実装を意識しなくても Ajax なインタフェースが作れる、という風になっています。 こんな感じで prototype.js は Ajax な部分に注目が集まっていますが、ほかにも "Class-style OO" なフレームワークも内包してます。 JavaScript はプロトタイプベースのオブジェクト指向言語で、C++ や Java のようなクラスベースのオブジェクト指向言語とはちょっと実装が異なります。プロトタイプ
第1章 はじめてのデザインパターン はじめに デザインパターンとは 特集の構成 すぐわかるオブジェクト指向 すぐわかるUML おわりに 第2章 逆引きカタログ ロジック編 Singleton (シングルトン) Factory/Factory Method (ファクトリ/ファクトリメソッド) Strategy (ストラテジ) Composite (コンポジット) Visiter (ビジタ) 第3章 逆引きカタログ J2EE編 Template Method (テンプレートメソッド) Facade (ファサード) ViewHelper (ビューヘルパ) DAO (Data Access Object) 第4章 逆引きカタログ その他 ユーティリティクラス 実行時例外を標準的に使う Nullオブジェクト 第5章 デザインパターン適用の勘所 はじめに アプリケーションの仕様 リファクタリング前のサ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く