这两种方法有区别吗?如果是,哪种方法更好?
第一种方法。 使用抽象类:
//Client class:
class Client extends Context
{
public function insertData()
{
$this->chooseStrategy(new DataEntry());
$this->algorithm();
}
public function findData()
{
$this->chooseStrategy(new SearchData());
$this->algorithm();
}
public function showAll()
{
$this->chooseStrategy(new DisplayData());
$this->algorithm();
}
}
//Context class:
abstract class Context
{
private $strategy;
public function chooseStrategy(IStrategy $strategy)
{
$this->strategy = $strategy;
}
public function algorithm()
{
$this->strategy->algorithm();
}
}
第二种方法。 使用简单的类
//Client class:
class Client
{
public function insertData()
{
$context = new Context(new DataEntry());
$context->algorithm();
}
public function findData()
{
$context = new Context(new SearchData());
$context->algorithm();
}
public function showAll()
{
$context = new Context(new DisplayData());
$context->algorithm();
}
}
//Context class:
class Context
{
private $strategy;
public function __construct(IStrategy $strategy)
{
$this->strategy = $strategy;
}
public function algorithm()
{
$this->strategy->algorithm();
}
}
两种方法都使用相同的IStrategy接口和相同的策略类。