代码改变世界

策略模式

2017-03-14 07:43  轩脉刃  阅读(542)  评论(0编辑  收藏  举报

最近工作使用到设计模式,在选用设计模式的时候,发觉设计模式理解不难,难的是在某个场景下选用哪个设计模式。就是设计模式的使用场景。

策略模式

策略模式适用情况是你已经知道了某个算法。第一步做什么,第二步做什么,第三步做什么。但是具体的三步在不同场景怎么做有不同的行为。

代码举例:

<?php

abstract Database
{
    abstract public function showTables();

    abstract public function showEngine();
}

class Content
{
    private $dabatase;

    public function setDatabase(Database $database) {
        $this->database = $database;
    }

    public function Print() {
        $tables = $this->database->showTables();
        $engine = $this->database->showEngine();
        return [
            'table' => $tables,
            'engine' => $engine
        ];
    }
}


class MysqlDatabase implements Database
{
    public function showTables() {
        return ['mysql1', 'mysql2'];
    }

    public function showEngine() {
        return ['innodb', 'myisam'];
    }

}

class PgDatabase implements Database
{
    public function showTables() {
        return ['pg1', 'pg2'];
    }

    public function showEngine() {
        return ['pginno1', 'pginno2'];
    }

}

$content = new Content();
$content->setDatabase(new MysqlDatabase());
$content->Print();

策略模式属于行为型模式。行为型模式主要是区分算法流程和对象的职责分配。在策略模式中,对象类界定对象行为。策略类界定算法流程。

一句话:策略模式适用于已知算法流程的行为场景。