10. デザインパターン(2/3)

テーマとキーワード: 振る舞いに関するパターン

Command, Iterator, Memento, Strategy

オブジェクト指向とクラス図(UML) 参照

デザインパターン GoFの提唱したデザインパターン。パターンのカタログ。良いコード作成のパターンに名前を付け、概念共有を促進した。

本講義では、生成に関するパターン、構造に関するパターン、振る舞いに関するパターン から幾つか代表的なものを取り上げ、Javaのプログラム課題として取り組む。

デザインパターン導入のメリット

・コード修正時のコードの複雑化を抑える。

if や for など制御構造や変数を駆使して個別のプログラムが必要な量が減る

・よく用いられているパターンを知ることでデザパタ導入のコードの可読性が増す。

・よく用いられているパターンをコードに導入することで、他のデザパタを使用したコードとスムーズに結合できる。※言語標準のライブラリーなど。

デザインパターン導入のデメリット

・クラスが増える

・クラス間の依存が増える

既存のコードの改良、もしくはコードを継続的に運用して修正・変更が加わることが導入の前提。

デザパタ導入で増えたコードによる複雑化以上のメリットがない場合もある。

・コードの動作を捉えにくい

どのデザパタを使っているか知らないと、導入したクラスの役割や効果を理解しにくい。

関数型プログラミング と オブジェクト指向

関数型のプログラミング言語や、それ由来の言語使用を導入したモダンなプログラム言語では、デザインパターンのうち幾つかは特に意識しなくても自然にコード作成できるようになっている。

型推論や関数(クロージャ)を使用したプログラミングについて、第12回、第13回で軽く触れる予定。

Commandパターン

Cat クラスにCommandパターンを導入し、猫の行動の具体的な内容を Commandオブジェクト に委譲する。 ※次回以降、導入予定

Mementoパターン

メメント・モリ

Cat クラスにMementoパターンを導入し、猫の行動に Undo 機能を実装する。 ※次回以降、導入予定

参考 Command と Memento パターンを利用した お絵かきアプレットの例)

2013年応用プログラミングI(旧カリキュラム)提出課題1311092

当初予定: 生成に関するパターン Singleton, Factory Method, Abstract Factory

オブジェクト指向やめましょう http://www.slideshare.net/nowokay/ss-41730024

紹介:

Visitorパターンで遊んでみたよ http://codezine.jp/article/detail/6829

GoFのデザインパターンについて、短文で要点解説、参考資料への豊富なリンクあり GoFの23のデザインパターンを,Javaで活用するための一覧表 (パターンごとの要約コメント付き)

(先週のづつき)

Project5

Command パターン と Memento パターンにより、猫にコマンドの実行と、行動リストの解決、行動手順のUndo の実現。

Mementoパターンで、コマンドの実行状況を記録する MacroCommand の例)

// Commandを作成
interface Command {

public abstract void execute();

}// cmd
// 記憶用のCommandを実装
class MacroCommand implements Command {

private Stack<Command> commands = new Stack<Command>();

public void execute() {

Iterator<Command> it = commands.iterator();

while (it.hasNext()) {

(it.next()).execute();

}// while

}// excute

public void append(Command cmd) {

if (cmd != this) {

commands.push(cmd);

}// if

}// append

public void undo() {

if (!commands.empty()) {

commands.pop();

}// if

}// undo

public void clear() {

commands.clear();

}// clear

}// macro

Java の Stack クラスを利用している。

スタックのメソッド:

データを入れる push

データを取り出す pop

データの取り出しでは、常に最後に入れたデータがとり出される。

お菓子の ペッツ の容器の様に) http://japanpez.blogspot.jp/2012/01/4-pez.html

ハンドガンの弾倉の構造も似ていいる。 http://ja.wikipedia.org/wiki/%E5%BC%BE%E5%80%89

Applet の初期化と、 paint メソッドに オフスクリーンバッファとして描画用画面を作成。

Graphics offg;

Image offimg;

private MacroCommand history = new MacroCommand();

public void init() {

offimg = createImage(600, 600); // オフスクリーンバッファ

offg = offimg.getGraphics();

setForeground(Color.black);

setBackground(Color.white);

paint メソッドの修正

public void paint(Graphics g) {

offg.setColor(Color.white);

offg.fillRect(0, 0, 600, 600); // 画面を消去する

history.execute();

g.drawImage(offimg, 0, 0, this); // オフスクリーンを描画

}// paint

各コマンドの作成

例) Item を使用するコマンド

class UseItemCommand implements Command {

ItemOwner io;

public UseItemCommand(ItemOwner io) {

this.io = io;

}

public void execute() {

io.useItem();

}

}

以下、演習中に指示

(次回の案)

Javaとピザとデザインパターン を元に、Visitor パターンを解説