php设计模式之策略模式

本文介绍了策略模式的概念及其在软件设计中的应用。策略模式通过将一系列算法封装到独立的类中,使得算法的选择和变更更加灵活。文章通过一个PHP鸭子游戏的例子展示了如何使用策略模式解决不同鸭子飞行行为的问题。

策略模式概念

策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,此模式让算法的变化独立于使用算法的客户。从而让程序结构更灵活,具有更好的扩展性和维护性

策略模式结构图

clipboard.png

策略模式角色说明

  1. 抽象策略角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现

  2. 具体策略角色:实现接口的具体算法

  3. 环境角色:持有抽象策略角色的引用

决策模式代码实现

实际场景中,为了避免在代码的重复,这里引用鸭子游戏的列子,参考文献: 《head first 设计模式》。
鸭子游戏中有个超类Durk,各自鸭子子类继承超类,在超类中有个fly方法,然而鸭子子类中会存在橡皮鸭子类,而橡皮鸭子是不会fly的,可以使用重载的方法,把橡皮鸭的fly()方法设置为空,但是当不会飞的鸭子变多的时候,代码重复就会越来越多,这个时候我们就可以用到策略模式来实现。

<?php

//定义一个抽象类
abstract class FlyBehavior{
    public function fly(){}
}

//抽象类的具体决策实现
class FlyWithWings extends FlyBehavior{
    public function fly(){
        echo "I can fly with wings";
    }
}

//抽象类的具体决策实现
class FlyWithNo extends FlyBehavior{
    public function fly(){
        echo "i can not fly";
    }
}

//引用抽象类
class Duck{
    private $_flyBehavior;

    public function __construct($object)
    {
        $this->_flyBehavior = $object;
    }

    public function fly(){
        return $this->_flyBehavior->fly();
    }
}

$duck = new Duck(new FlyWithWings());
echo $duck->fly();

总结

在实际场景中,如果应用需要变化之处,把他们独立出来,单独封装,封装好接口后,通过指定的接口实现类进行算法的变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值