スキップしてメイン コンテンツに移動

Strategyパターン

アルゴリズムの実装を外部にカプセル化して交換できるようにするパターン
カプセル化するアルゴリズムに必要な動作をインターフェースに定義して各々実装させる。
型定義が必要な言語ではインターフェース型の変数で受ける。


/**
* Strategyパターンサンプル
* @create 2007/06/15
*/

/**
* Vehicle - 乗物のスーパークラス
*/
class Vehicle
{

private $_speed; ///< 変速を格納する
private $_alarm; ///< 警告音を格納する

/**
* setSpeedType - 引数で受け取った変速を格納する
* @param ITypeSpeed $speed
* @return void
*/
public function setSpeedType($speed)
{
$this->_speed = $speed;
}

/**
* setAlarmType - 引数で受け取った警告音を格納する
* @param ITypeAlarm $alarm
* @return void
*/
public function setAlarmType($alarm)
{
$this->_alarm = $alarm;
}

/**
* dispShift
*/
public function dispShift()
{
$this->_speed->dispShift();
}

/**
* shiftUp
*/
public function shiftUp()
{
$this->_speed->shiftUp();
}

/**
* shiftDown
*/
public function shiftDown()
{
$this->_speed->shiftDown();
}

/**
* alarm
*/
public function alarm()
{
$this->_alarm->alarm();
}
}

/**
* 変速インターフェース
*/
interface ITypeSpeed
{
public function dispShift();
public function shiftUp();
public function shiftDown();
}

/**
* 1段ギア(変則無し)
*/
class Speed_1 implements ITypeSpeed
{
public function dispShift()
{
print "ギアチェンジの機能はありません";
}
public function shiftUp()
{
print "できません\n";
}
public function shiftDown()
{
print "できません\n";
}
}
/**
* 3段ギア
*/
class Speed_3 implements ITypeSpeed
{
private $_max=3;
private $_current=1;

public function dispShift()
{
print "現在のギアは" . $this->_current . "に設定されています\n";
}
public function shiftUp()
{
if ($this->_max > $this->_current) $this->_current++;
else print "既に最大です\n";
}
public function shiftDown()
{
if (1 < $this->_current) $this->_current--;
else print "できません\n";
}
}
/**
* 5段ギア
*/
class Speed_5 implements ITypeSpeed
{
private $_max=5;
private $_current=1;

public function dispShift()
{
print "現在のギアは" . $this->_current . "に設定されています\n";
}
public function shiftUp()
{
if ($this->_max > $this->_current) $this->_current++;
else print "既に最大です\n";
}
public function shiftDown()
{
if (1 < $this->_current) $this->_current--;
else print "既に最小です\n";
}
}
/**
* 無限段ギア
*/
class Speed_Infinity implements ITypeSpeed
{
private $_current=1;

public function dispShift()
{
print "現在のギアは" . $this->_current . "に設定されています\n";
}
public function shiftUp()
{
$this->_current++;
}
public function shiftDown()
{
if (1 < $this->_current) $this->_current--;
else print "既に最小です\n";
}
}

/**
* 警告音インターフェース
*/
interface ITypeAlarm
{
public function alarm();
}

/**
* ベルアラーム
*/
class Alarm_Bell implements ITypeAlarm
{
public function alarm()
{
print "チリンチリン\n";
}
}
/**
* クラクション
*/
class Alarm_Horn implements ITypeAlarm
{
public function alarm()
{
print "プップー\n";
}
}
/**
* ホームラン
*/
class Alarm_BigSwat implements ITypeAlarm
{
public function alarm()
{
print "カキーン!\n";
}
}

/**
* Car - 乗物を継承する車サブクラス
*/
class Car extends Vehicle
{
function __construct()
{
$this->setSpeedType(new Speed_5());
$this->setAlarmType(new Alarm_Horn());
}
}

/**
* Bicycle - 自転車を継承するテレビサブクラス
*/
class Bicycle extends Vehicle
{
function __construct()
{
$this->setSpeedType(new Speed_3());
$this->setAlarmType(new Alarm_Bell());
}
}


/**
* 乗物をインスタンス化
*/
$kuruma = new Car();
$jitensya = new Bicycle();

/** 車の動作 */
print("車の動作\n");
$kuruma->dispShift();
$kuruma->shiftUp();
$kuruma->dispShift();
$kuruma->shiftDown();
$kuruma->shiftDown();
$kuruma->dispShift();
$kuruma->alarm();

/** 自転車の動作 */
print("自転車の動作\n");
$jitensya->shiftUp();
$jitensya->shiftUp();
$jitensya->dispShift();
$jitensya->shiftUp();
$jitensya->alarm();

/** 車のクラクションを改造 */
print("車のクラクションを改造\n");
$kuruma->setAlarmType(new Alarm_BigSwat());
/** 鳴らしてみる */
$kuruma->alarm();

/** 自転車のギアを近未来型に改造 */
print("自転車のギアを近未来型に\n");
$jitensya->setSpeedType(new Speed_Infinity());
/** ギアを100段上げてみる */
print("ギアを100段上げてみる\n");
for ($i=0; $i<100; $i++) $jitensya->shiftUp();
$jitensya->dispShift();

?>


謎の機能を示しますが一応動きます。

コメント

このブログの人気の投稿

日記をつけはじめて1年とちょっと経ったまとめ

日記をつけはじめて1年とちょっと経ったまとめ去年(2017)の 1/11 から日記をつけ始め、気づくともう1年以上ほぼ毎日つけていました
まさか習慣化するとは思っていなかったんですが、意外と続いたので一旦まとめておこうと思ってのエントリこのエントリでは どういう手法で続けてきたか続けてきた結果どうなったか などをまとめておいて、自分用の改善材料にすること、及び、このエントリを見た人の判断材料にすることを目的としています…ので、書き始めた主要因である書籍 日記の魔力 については、覚えている内容を参考にする程度で、本自体の紹介はほぼしないです(読み返すのが面倒だっただけじゃないです)まとめ書いてみたら長くなったので、まとめから自分用のフォーマットを整えれば意外と書くのは楽愚痴も悩みもとりあえず文字に吐き出すと精神衛生上良い忘れっぽいと思っていたら、思っていたより数倍物事を忘れていることに気づく万が一興味を持ったら一度 日記の魔力 を読んでみては今後は…これまで通り毎日ログを書くふりかえりの意義を再考して、ちゃんと毎週&毎月ふりかえるようにするふりかえりの中で、どういうログを書いておくと使いやすいか考えて、日記自体も改善する以降、自分のふりかえりも兼ねているため長文ですが、つらつらと書きますきっかけ最初のきっかけは、 Twitter のタイムラインに流れてきたブログのエントリ 思考や行動を改善できる「日記の魔力」とは の引用…だった気がする(この時はまだログをつけていなかったので記録も記憶も残っていない…)ここで紹介されている 日記の魔力 という本を一通り読み、本に書いてあるとおりに 騙されたと思って日記を書き始めてみよう と思ったのが最初の一歩手法記憶が朧げですが、確か本の著者の方の手法はワープロかPCか何かで、毎日のログを隙間時間にファイルに記述する10日に一度くらいのスパンでそれまで書いた日記をふりかえる ふりかえりの中で、自分が人生で追っていきたい主題みたいなものに関連する内容を別のファイルにコピペして貯めていくみたいな形だったはず。色々と細かいルール(天気などの後から調べれば分かることは書かない等)が少しあった気がするけれど、既に覚えていないですそれを基にしつつ、自分の今の流れは以下の様な形に落ち着いています日付毎の1ファイルに、その日の出来事、やったこ…

のどかを購入した

以前以下の辺りの記事
変態キーバインドを勧めてみる続・変態キーバインドを勧めてみるで紹介したように、完全に「窓使いの憂鬱」に依存している自分にとって、
Vistaや7への移行の最大の妨げとなっていたのがVista発表とほぼ同時期に発表されたこの一文。

「窓使いの憂鬱」の開発は終了いたしました。Windows Vista では動作しませんのでご注意ください。

当初はかなりショックを受けたものです。

すぐに有志のパッチが出たりはしたのですが、その後派生プロジェクトとして
のどか[http://www.appletkan.com/nodoka.htm]というものがapplet氏により開発、継続されました。

基本的にVistaでは"デジタル署名のないデバイスドライバは動作しない"ため、フリーソフトのレベルでは限界がありました。
この"のどか"は、シェアウェアであり、いずれ法人化&署名獲得を目指すということで、当時から購入を迷っていたのですが、
この度、めでたく法人化されるということでこの機会に購入。

窓使いの憂鬱をアンインストールし、のどかをインストールしました。

設定ファイルなどは若干の修正が必要なものの、ほぼ今までの物をそのまま使えたため、スムーズに移行することができました。

これで学校のPCや新ノートのVista(そのうち7)でも快適なタイピング環境が構築できそうです。

追記
Vista 64bitの場合、起動時にF8でメニューを出して署名強制を無効にしないと動作しないらしい。
これを調べていなくて学校のPCへのインストールに時間がかかりました。

現在は快調に動作中。
セミコロンエンターがいい感じです。

追記の追記
とうとう署名付き版のv4.10がリリースされたようです。
インストールしてみたところ署名強制無効を行わずに問題なく動作しました。

続・変態キーバインドを勧めてみる

以前 変態キーバインドを勧めてみる で紹介したキーバインドを若干修正したので、改めて紹介。
導入やら詳細は上記に依るとして、現状は

使用ソフト
窓使いの憂鬱(WindowsVista非対応)IMEのプロパティ
キーバインド内容
CapsLock→LeftCtrlセミコロン→EnterC-セミコロン→セミコロンC-h→バックスペースC-[→EscC-無変換→[C-変換→]S-無変換→{S-無変換→}C-ひらがな→\C-ひらがな→|無変換:日本語OFF、変換文字の半角化変換:日本語ON、変換文字の全角英数化ひらがな:変換文字のカタカナ化
な感じになっています。

最後の3つはIMEのプロパティで設定、
その他窓使いの憂鬱を用いた設定内容は、

include "109.mayu" # JIS配列の場合はこちら

# CapsLockをControlに
mod control += 英数
key *英数 = *LeftControl

# セミコロンをエンターに
key *IC-SemiColon = Enter

# Ctrlを押しながらだとセミコロンに
key *IC-C-~S-SemiColon = SemiColon

# Ctrl+Hをバックスペースに
key *IC-C-H = BS

# vi風キー操作
key C-OpenBracket = ESC
key IC-C-OpenBracket = ESC

# 遠いキーを近くへ
key C-無変換 = OpenBracket
key C-変換 = CloseBracket
key S-無変換 = S-OpenBracket
key S-変換 = S-CloseBracket
key C-ひらがな = YenSign
key S-ひらがな = S-YenSign

こんな感じです。

オレンジは今回新しく追加したもの、
青はおおよそ誰にでもお薦めできるバインドです。

赤は、初心者にはお薦めできn(ry なものです。
慣れるまでかなりいらいらしますが、慣れてしまうとタイピングの勢いが何かを決定するたびに止まってしまって逆にいらいらする感じになります。なってます。

窓使いの憂鬱はVistaで未対応と書きましたが、一応後継機としてのどかというソフトが別の方により引き続き更新されており、
そちらは動作するようになっているそうです。

日本語キーボー…