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

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

?>


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

コメント

このブログの人気の投稿

git を操作したい時にちょっと便利かもしれない unite-source を書いています

こんばんは。この記事は、 Vim Advent Calendar 2012 の 50日目の記事です。
49日目は、 @uryt さんの vim.orgにアップロードされていないプラグインがあるかチェックするgit-unreleased-vimplugins作った でした。

本日は、長いこと自前で作成している、 unite を利用して 簡単な git 操作を行える unite-source 、 giti を紹介します。

vim-unite-giti
https://github.com/kmnk/vim-unite-giti

これは何?初期構想としては、自分の自分による自分のための git 操作用 unite source です。
現在はドキュメントも書いたので、自分以外の方にも、お使いいただける物になっていると思います。

言わずと知れた unite のインターフェースを用いて、 git の色々な操作を実現するための plugin's plugin になります。
unite を使って git 操作をしたい気持ちになる方に、是非使ってみて頂きたいです。

普段の仕事でヘビーに使っているので、基本的な操作に関しては、この source で(多分)完結できるはずです。

何故作ったの?git の vim plugin と言えば、有名な vim-fugitive があります。

自分も、仕事で使うバージョン管理システムが svn から git に移行したタイミングで、最初は使おうとしていました。
ですが、長らく(こちらも自前の) vim-unite-svn で、バージョン管理システムを unite 経由で使うことに慣れきってしまっており、
差分をコミットするごとにフラストレーションが溜まり、限界を超えた頃、気づくと自前で作成していました。

何ができるの?(自分が仕事を使ってる分には不自由しない程度に)基本的な操作は大体出来ます。

source 名を羅列すると、以下のような物を用意してあります。

* giti/branch, giti/branch_all
* giti/config
* giti/log
* giti/remote
* giti/status

それぞれ、簡単に説明してみます。

giti/branch, giti/branch_allgit branch や git branch -a を叩いた結果を…

builderscon tokyo 2017 に行ってきた

builderscon tokyo 2017 に行ってきたbuilderscon tokyo 2017 (2017/08/03-05) の本編1,2日目に行ってきましたきっかけは rebuild.fm のスポンサー宣伝
YAPC ASIA の系統をついでいるのもあるのか、 コンテンツ はかなり幅のある内容で、誰でも興味のある内容が何かしらあるであろう。な、カンファレンスでした発表資料は既に タイムテーブル の各詳細ページに大体公開されているので、内容はそちらを参考にしていただければと思います(リンクが貼られていないものも少し有りますが、検索すればどこかに上がってることが多いはずです)このエントリでは、自分が聞きに行ったセッションがどこだったかのリストとセッション全体についてのざっくりとした感想、及び、カンファレンス自体についてのざっくりとした感想を書いておき、来年以降また開催された時の参加判断の資料にできればと思います更新履歴2017.08.07 公開聞いたセッション実際にその場に行って、聞いたセッションのリスト1日目OpeningDeepLearningによるアイドル顔識別を支える技術ランチセッション A 株式会社VOYAGE GROUPランチセッションB Momentum株式会社マイクロチームでの高速な新規開発を支える開発・分析基盤Goで実装する軽量マークアップ言語パーサー2日目静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話小さく始めて育てるコンパイラランチセッション【PR】エンジニアがkintoneを使うべき3つの理由 サイボウズ株式会社ランチセッション 【PR】検索サービス開発が絶対におもしろいと思う理由 Supership株式会社polyglot になろう !!WEB+DB PRESS 100号記念 特別企画聞きたかったセッション後評判を聞いたりして、聞きたかったかなーと思ったセッション(後でスライド読む)1日目Desktop Apps with JavaScript横山三国志に「うむ」は何コマある?〜マンガ全文検索システムの構築RDBアンチパターン リファクタリングLT全部
#builderscon TL が大分沸いていた(残っていた人全員が見ていたのもあると思うけれど)2日目Ionic 3+ではじめる次世代アプリ開発(…

のどか(と窓使いの憂鬱)のvim風キーバインド設定を書いてみた

せっかくのどかを購入したのにあんまりキーバインドの改造をしていないので、練習がてらざっくりとvim風キーバインド設定を書いてみました。

多分窓使いの憂鬱でも動きます。動作確認はしていないです。

個人的に以下のキーバインドを先に行っているので、それ前提で見ていただければ。


# CapsLock 単発だと Esc になり、押しながら何かを押すと Ctrl になる
mod ctrl += !!英数
key *英数 = *Esc

# SemiColon を Enter に
key *IC-SemiColon = Enter

# Control を押しながら SemiColon で SemiColon
key *IC-C-~S-SemiColon = SemiColon


で、以下がvim風キーバインド


### vim mode
## vim mode トグル
key C-OpenBracket = &Toggle(Lock0)

## keymaps
# 一行ヤンク
keymap2 LineYankReady
key L0-*S-*C-*A-Y = Home S-End C-C Home

# 一行デリート
keymap2 LineDeleteReady
key L0-*S-*C-*A-D = Home S-End C-X

# 一行カット
keymap2 LineCutReady
key L0-*S-*C-*A-C = Home S-End C-X

# 頑張って一番上まで戻ろうとする
keymap2 GoTopReady
key L0-*S-*C-*A-G = PageUp PageUp PageUp PageUp PageUp

# exモードセーブ
keymap2 ex_mode_save
key L0-*S-*C-*A-Enter = C-S
key L0-*S-*C-*A-SemiColon = C-S # Enter代替

# exモード
keymap2 ex_mode
key L0-*S-*C-*A-W = &Prefix(ex_mode_save)

keymap Global

## vim mode 時の挙動
# default mode (Lock0 : on)
key L0-*S-*C-*A-_1 = &Undefined
key L0-*S-*C-*A-_2 = &…