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

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();

?>


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

コメント

このブログの人気の投稿

のどかを購入した

以前以下の辺りの記事
変態キーバインドを勧めてみる続・変態キーバインドを勧めてみるで紹介したように、完全に「窓使いの憂鬱」に依存している自分にとって、
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で未対応と書きましたが、一応後継機としてのどかというソフトが別の方により引き続き更新されており、
そちらは動作するようになっているそうです。

日本語キーボー…

就職活動現況報告

今週若干余裕があるので少しネタの更新・・と思っていますが
研究も進めないといかんので保留。。

本を読む本 (講談社学術文庫)
をほぼ読み終わったので
電車の中で次はviの本かWebプログラミング基本みたいな本を読もうと思います。

後は久々に漫画を衝動買い。

ぷりぞな6 1 (サンデーGXコミックス)
これ。絵描いてる人が韓国の人らしい。
ブラックラグーンの作者が支持みたいなことが書いてあったので読んで見ました。
まー絵は萌え系みたいな感じだけどシリアス混じってて面白そうかな?
Amazonでは絵が無いですが一応公式の紹介は
GX作家&作品紹介こんな感じです。
結構表紙飾っているようなので見たことある人も居るかもしれません。


で、タイトルの就活現況では、前回順調とか言ってましたが
志望していた6社のうちとうとう1社落ちました。
しかも結構でかいところです。

グループ面接の時点で落ちてしまったので、
もしかしたら表面の部分(礼儀とか仕草)で落とされたのかもしれないですが、
反省としては
内容が冗長で話す内容が長かった何か反論された時に言い訳じみた答えを返してしまった自分はエンジニア経験があるんだ的な内容を押しすぎた辺りと考えています。
で、対策。

まず冗長分ですが、今のところ話す内容を完全に決めてしまわずに、
ある程度の枠を決めてその場で考えて話しているので
もうちょっと
質問の後に結論を考えてから内容を話すように気をつけようと思います。

反論じみた言い訳というのは、とっさに返してしまう対応策みたいなもので、
相手に
この人は実務でミスしてもその場対応するんじゃないかという印象を与えてしまった気がしております。
ので、対策としては
一度相手の内容を肯定して、その上で簡潔にこうすればいいんじゃないかと思うと一言返す位に留めようと思います。

最後にエンジニア押しは、一応自分の売りの一つではあるので止めることはせずに
事実だけをしっかり伝えて冗長分は省くというような感じにしようかと思います。

以上。
自分の反省なので発信するような内容じゃないんですが、
文に書かないとなかなか省みない性格なので文にして発信。
結論を言えば「もっと落ち着いて簡潔に」を心がけるといったところでしょう。

正直面接凄い苦手なのでなかなか落ち着くのはきついですが、
省みなずに
運が悪かった。次頑張ろうというのは嫌なので、逐次頑張ろうと思います。

以上。明日も就活ですが、…