设计模式-策略模式(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();
其实策略模式通俗来讲很简单,在程序开发中的好处是能够抽象复用和解耦。针对接口编程,而不是针对实现编程