策略模式

目录 设计模式

策略模式属于行为型模式
概述:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户
策略模式:
定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户

封装:
把行为用接口封装起来,我们可以把那些经常变化的部分,从当前的类中取出来,用接口进行单独的封装。
互相替换:我们封装好了接口,通过指定不同的接口实现类进行算法的变化。

<?php
/**
 * 策略模式接口
 * 
 */
interface FlyBehavior{
 
 public function fly();
}
<?php
/**
 *用翅膀飞行
 */
class FlyWithWings implements FlyBehavior{
 /**
  *飞行方法
  *
  */
 public function fly(){
  echo 'fly with wings';
 }
}
<?php
/**
 *不用翅膀飞行
 */
class FlyWithNo implements FlyBehavior{
 /**
  *飞行方法
  */
 public function fly(){
  echo 'fly with no';
 }
}
<?php
/**
 *鸭子类
 */
class Duck{
 /**
  *飞行实例
  *@var FlyBehavior object
  */
 private $_flyBehavior;

 /**
  *开始飞
  *
  */
 public function performFly(){
  $this->_flyBehavior->fly();
 }

 /**
  *设置飞行实例
  *@param $behavior Flybehavior
  */
 public function setFlyBehavior( FlyBehavior $behavior ){
  $this->_flyBehavior = $behavior;
 }
}

<?php
/** 
 *橡皮鸭 
 */ 
class RubberDuck extends Duck{
}
<?php
 /**
 * 策略模式
 */
public function actionStrategy(){
 
     Yii::import('ext.strategy.*');
     $duck = new RubberDuck();
        
     /* 橡皮鸭用翅膀飞行 */
     $duck->setFlyBehavior(new FlyWithWings());
     $duck->performFly();
     
     /* 橡皮鸭不用翅膀飞行 */
     $duck->setFlyBehavior( new FlyWithNo() );
     $duck->performFly();
}

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注