设计模式-策略模式(Strategy)
策略模式(Strategy)
策略模式-定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
定义:策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
个人理解:其实策略模式跟抽象有一些通性,把共同的和不同的分开,共同的特性公用,不同的用不同的来实现。达到解耦和复用。
这里举几个现实中我认为采用策略模式的例子,
具体的灯泡可以有不同的形式不同的亮度但是是一个底座就可以用。
我们下面实现一个具体的例子:
在我们一般的框架中缓存或者存储底层都是统一的底层实现,但是落地的可以是文本,memcache,redis,mysql等不同的存储介质。其实当不同的存储方式的时候一般是调用了不同的类,但是在使用方面,你可以把他们当成一样的来使用。(当然这里面也有一些外观模式的概念,很多实际使用都是多种模式运用的)
需求:我们系统有日志模块,根据不同的模式可以采用不同的方式来处理可以采用直接输出,保存文本,保存数据库,保存到redis几种方式
实现方式
/**
* 消息处理策略
*/
interface Strategy{
public function handle();
}
/**
*@desc 具体策略 case
*/
class EchoCliStrategy implements Strategy{
public function handle(){
//Func Coding........
echo "Strategy:".__CLASS__;
}
}
/**
*@desc 具体策略 case
*/
class SaveTxtStrategy implements Strategy{
public function handle(){
//Func Coding........
echo "Strategy:".__CLASS__;
}
}
/**
*@desc 具体策略 case
*/
class SaveDBStrategy implements Strategy{
public function handle(){
//Func Coding........
echo "Strategy:".__CLASS__;
}
}
/**
*@desc 具体策略 case
*/
class SaveRedisStrategy implements Strategy{
public function handle(){
//Func Coding........
echo "Strategy:".__CLASS__;
}
}
/**
* @desc 客户端类或者环境类,定义一个接口让strategy访问对应的数据接口
*/
class Client{
private $_strategy;
public function __construct(Strategy $strategy){
$this->_strategy = $strategy;
}
public function setStrategy(Strategy $strategy){
$this->_strategy = $strategy;
}
public function handle(){
$this->_strategy->handle();
}
}
//消息直接输出
$client = new Client(new EchoCliStrategy());
$client->handle();
//消息通过Redis处理
$client = new Client(new SaveRedisStrategy());
$client->handle();
//变更策略
$client->setStrategy(new SaveTxtStrategy());
$client->handle();
其实策略模式通俗来讲很简单,在程序开发中的好处是能够抽象复用和解耦。针对接口编程,而不是针对实现编程

