PHP 策略者模式 清晰总结

首先看一下百度百科对策略者模式的定义:


        策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

        策略模式的优点有:策略模式提供了管理相关的算法族的办法、策略模式提供了可以替换继承关系的办法、使用策略模式可以避免使用多重条件转移语句。

        接下来看一下策略者模式需要的组成:

—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
—具体策略角色:包装了相关的算法和行为。
—环境角色:持有一个策略类的引用,最终给客户端调用。

        然后举一个例子:关于dota玩家在游戏中被杀后的情绪:画面比较美

        素质最好的可能会说:技不如人,甘拜下风;
        素质比较好的可能会称赞对方;
        素质比较差的可能就会关进小黑屋了。。。


<?php

class dotar
{
	public function say()
	{
		if(isset($_GET['best'])){
			echo "技不如人,甘拜下风";
		}else{
			echo "真是日狗了";
		}
	}
}

$miQi = new dotar();
$miQi->say();


这个简单的代码大家都明白,现在要是多了一个素质极其差的玩家,又多了一个神经病玩家,我们就要ifelse,这样硬编码的方式不太好。
此时可以用策略者模式:


<?php

//	抽象策略角色	策略类,通常由一个接口或者抽象类实现
interface dotar
{
	public function say();
}

//	具体策略角色	包装了相关的算法和行为
class bestDotar implements dotar
{
	public function say()
	{
		echo "技不如人,甘拜下风";
	}
}

//	具体策略角色	包装了相关的算法和行为
class betterDotar implements dotar
{
	public function say()
	{
		echo "大侄子,这波操作可以";
	}
}

//	具体策略角色	包装了相关的算法和行为
class badDotar implements dotar
{
	public function say()
	{
		echo "日了狗了,我要...你...";
	}
}

class test
{
	protected $hero;
	
	public function index()
	{
		$this->hero->say();
	}
	
	//	环境角色	持有一个策略类的引用,最终给客户端调用
	public function role(dotar $heros)
	{
		$this->hero = $heros;
	}
}

$test1 = new test();

if(isset($_GET['better'])){
	$heros = new betterDotar();
}elseif(isset($_GET['best'])){
	$heros = new bestDotar();
}else{
	$heros = new badDotar();
}

$test1->role($heros);
$test1->index();


大家可能会觉得,这不就是把ifelse写在外面了吗?
不是只将if else移动到外面,这是一种思想,处理某一个策略使用一个类来处理,而不是将一堆逻辑写到一个action中;

如果在里面写逻辑判断就会存在‘依赖’,这个是不好的,存在很大耦合,所以把逻辑写在外部,作用就是‘注入’一个对象。

请大家参考指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
策略模式是一种常见的设计模式,可以在 PHP 中很容易地实现。 策略模式的核心思想是将算法封装成一个个独立的策略,然后在运行时根据不同的情况选择不同的策略。这样可以使得算法的变化独立于使用算法的客户端,提高代码的可维护性和扩展性。 下面是一个 PHP 中的策略模式的例子: ```php // 定义策略接口 interface PaymentStrategy { public function pay($amount); } // 实现不同的策略 class CreditCardStrategy implements PaymentStrategy { public function pay($amount) { echo "Paid $amount via Credit Card."; } } class PaypalStrategy implements PaymentStrategy { public function pay($amount) { echo "Paid $amount via Paypal."; } } // 使用策略 class PaymentContext { private $strategy; public function __construct(PaymentStrategy $strategy) { $this->strategy = $strategy; } public function executeStrategy($amount) { $this->strategy->pay($amount); } } // 示例代码 $cc = new CreditCardStrategy(); $paypal = new PaypalStrategy(); $payment = new PaymentContext($cc); $payment->executeStrategy(100); $payment = new PaymentContext($paypal); $payment->executeStrategy(200); ``` 在这个例子中,我们定义了一个 `PaymentStrategy` 接口,包含了一个 `pay()` 方法,然后实现了两个不同的策略 `CreditCardStrategy` 和 `PaypalStrategy`。最后,我们使用 `PaymentContext` 来执行不同的策略。 这个例子很简单,但是可以看到策略模式的优点:算法的变化独立于客户端代码,我们可以轻松地增加、删除或修改不同的策略,而不需要修改客户端代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值