欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

php设计模式-------(1)策略模式

程序员文章站 2023-12-22 21:57:34
...
一、为什么我要学习设计模式。

  我的上一个项目是做App接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕。而且很多时候,调用接口的开发人员来找我说某个接口出错了,我回去调试一看才发现果然粗心写错一句代码,然而有六七个控制器里面我都有同样的语句,这就造成了我要回去查找那六七个文件,然后挨个修改。这下就傻眼,突然发现我真的应该看看设计模式了,这样可以提高代码质量,客户修改需求的时候也不至于让自己咬牙切齿(大家应该都有这种体会,哈哈);

二、策略模式

1.概念

策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(概念太难理解)

2.为什么会有策略模式

  joe上班的公司做了一套模拟鸭子的游戏,游戏中会出现各种鸭子,有的会呱呱叫,有的会飞。

代码:

 1 php
 2 class Duck {
 3     public function quack(){}
 4     public function swim(){}
 5     public function display(){}
public function fly(){
//会飞了
}
6 //鸭子的其他方法 7 } 8 9 class MallarDuck extends Duck{ 10 public function display(){ 11 //外观是绿头 12 } 13 } 14 class RedDuck extends Duck{ 15 public function display(){ 16 //外观是红头 17 } 18 }

这样继承了Duck类的子类都可以实现飞行行为,但是如果玩具鸭就不能有飞行行为的话不是闹笑话了么? 有的人会说,我可以在子类里面重写父类的fly方法,这样就可以针对不同的具体子类给予不同的行为。但是这样的话,不是重复很多代码了吗?相信大家会直接copy,这样如果某一个地方出错,所有地方都要重新更改,而且老板随时改变需求,我们会被直接累趴。

所以设计模式里的原则来了:

1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

2.针对接口编程,而不是针对实现编程。

3.多用组合,少用继承。

三、具体代码

php
abstract class Duck {
    public $flyBehavior;    //飞行行为
    public $quackBehavior;  //叫行为
    public function swim(){
        echo '鸭子会游泳';
    }
    public function performQuack(){
        $this->quackBehavior->quack();
    }
    public function performFly(){
        $this->flyBehavior->fly();
    }
    public function setFlyBehavior(FlyBehavior $fb){
        $this->flyBehavior = $fb;
    }
    public function setQuackBehavior(QuackBehavior $qb){
        $this->quackBehavior = $qb;
    }
    abstract function display();
}

interface FlyBehavior {
    public function fly();
}
class FlyWithWings implements FlyBehavior{
    public function fly(){
        echo '会飞';
    }
}
class FlyNoWay implements FlyBehavior {
    public function fly(){
        echo '不会飞';
    }
}

interface QuackBehavior {
    public function quack();
}
class Quackd implements  QuackBehavior {
    public function quack(){
        echo '呱呱叫';
    }
}
class Squeak implements  QuackBehavior {
    public function quack(){
        echo '吱吱叫';
    }
}
class MuteQuack implements  QuackBehavior {
    public function quack(){
        echo '不会叫';
    }
}

/**
 * 模型鸭类
 */
class ModelDuck extends Duck
{
    public function __construct()
    {
        $this->flyBehavior = new FlyNoWay();
        $this->quackBehavior = new Quackd();
    }

    public function display()
    {
        echo '模型鸭';
    }
}
//测试代码
$m = new ModelDuck();
$m->display();
$m->performQuack();
$m->performFly();
$m->setFlyBehavior(new FlyWithWings());
$m->performFly();

最后,设计模式是一种思想,不必生搬硬套,要不然只能适得其反。

上一篇:

下一篇: