PHP设计模式之一策略模式

原创 2015年11月17日 18:20:59

案例分析:

        原公司场景设计的项目构造需要更改,以前设计类结构如下

                          


现在提出产品需求,在游戏的角色中添加一个玩具鸭子。

负责开发的小坤同志,头一眼看到需求,说,哎呀,这还不简单,哥可是专门写OOP出身的,分分钟拿下,

思路如下:

       新建一个ToyDuck,直接继承Duck,实现它所有的方法,

哈哈,小坤同志洋洋得意的看着自己的设计。喜悦之情无法言表,这么容易就完成了这种设计,太棒了。

可是~~~~BUT~~~~~~~问题来了

       第一,BlackDuck和RedDuck行为是差不多的,就颜色不一样嘛,那你全部覆盖父类的设计好吗?

       第二,比如说我以后再设计别的类,拿ToyDuck类来说,不会叫,不会飞,这种情况肿么办?

       第三,符合软件工程里面的高内聚,低耦合的设计思想吗?

小坤同志振臂一呼,那还不容易,一切皆继承。没有的直接写空函数不行吗?

       可是这样真的好吗,代码会不会混乱?


       下面咱们介绍一种常用的设计模式,可以解决这个问题:

       分析业务场景:

               Duck、BlackDuck、RedDuck的属性都是一样的,这个没有异议吧,最大的不同就是他们的行为,有的会飞不会叫,有的会叫不会飞,有的既不会飞,也不会叫

咱们从行为入手,把变的东西抽象出来,以不变应万变。

           

        把会飞的行为和说话的行为设计成接口,把每一个可能的飞的行为设计成行为类,这就是抽象,当以后再扩展类的时候,不用贴更多代码实现覆盖,只需要调用不同的行为类即可。

         这样Duck类内部全部是设计好的类,以后再扩展不用动这个类,行为类也不用动,只要以后添加就可以,以前的代码都不用动。

         代码如下:

 Duck      

<?php
abstract class Duck
{
	protected $weight;
	protected $color;
	protected $flyx;
	protected $quackx;

	public function setColor($color)
	{
		$this->color = $color;
	}

	public function setFlyXingwei(FlyInterface $flyx)
	{
		$this->flyx = $flyx;
	}

	public function setQuackXingwei(QuackInterface $quack)
	{
		$this->quackx = $quack;
	}

	public function flyPerform()
	{
		$this->flyx->fly();
	}

	public function quackPerform()
	{
		$this->quackx->quack();
	}


 	
}
?>
FlyInterface.php
<?php
interface FlyInterface
{
	public function fly();
}
?>
FlyWithWing.class.php  行为类

<?php
class FlyWithWing implements FlyInterface
{
	public function fly()
	{
		echo  "我是用翅膀飞的!";
	}
}
?>

FlyNoWay.class.php

<?php
class FlyNoWay implements FlyInterface
{
	public function fly()
	{
		echo "我是用翅膀飞的!";
	}
}
?>

会说话的行为接口

QuackInterface.php

<?php
interface QuackInterface
{
	public function quack();
}
?>

用haha说话的行为类

QuackWithhaha.class.php

<?php
class QuackWithhaha implements quackInterface
{
	public function quack()
	{
		echo "我是会哈哈叫的!";
	}
}
?>

用lala说话的行为类

QuackWithlala.class.php

<?php
class QuackWithlala implements quackInterface
{
	public function quack()
	{
		echo "我是会哈哈叫的!";
	}
}
?>
新建一个BlackDuck

<?php
class BlackDuck extends Duck
{
	public function display()
	{
		echo "我是一只黑色的鸭子";
	}
}
?>

index.php

<?php
include("Duck.class.php");
include("FlyInterface.php");
include("QuackInterface.php");
include("FlyWithWing.class.php");
include("FlyNoWay.class.php");
include("QuackWithhaha.class.php");
include("QuackWithlala.class.php");
include("BlackDuck.class.php");

$blackDuck = new BlackDuck();
$blackDuck->setFlyXingwei(new FlyWithWing());
$blackDuck->flyPerform();
$blackDuck->setQuackXingwei(new QuackWithlala());
$blackDuck->quackPerform();
?>
这样就实现了低内聚高耦!
小坤童鞋,就这样去完成你的设计任务吧~~~~~~

相关文章推荐

PHP面向对象编程设计模式(一)策略模式

在面向对象的入门课程C++(或者JAVA)中,封装数据和方法好像是面向对象最重要的一个特点,当然还有基于继承实现的多态和重载。其实每一种OOP语言,由于彼此功能上的差异性,这些特点只能适用于某一种特定...

PHP设计模式——策略模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。        策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变...
  • jhq0113
  • jhq0113
  • 2015年05月16日 22:15
  • 3750

PHP设计模式--策略模式

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 封装:把行为用接口封装起来,我们可以把那些经常变化的部分,从当前的类中单独取出来,用接口进行单...

Php设计模式之【策略模式Strategy Pattern】

【案例】 黑枣游戏公司开发小鸡快跑的游戏,小鸡从鸡窝开跑,狂奔100米后到达安全地带。这500米中,小鸡可以使用辅助工具,不限于鸡爪、滑板、自行车、火箭运输。 【分析OOA】 小鸡快跑游戏是使用...
  • uuleaf
  • uuleaf
  • 2012年05月21日 15:01
  • 815

5. php设计模式:策略模式的实际应用

原文地址 最近写了一个集成各家支付的开源项目(支付宝与微信)。项目地址。让调用支付变得更加简单、统一。目前已经在公司商城推行使用,上海一米市集也采用了这个支付集成项目。我可不是打广告哦,只是为了让大家...
  • hel12he
  • hel12he
  • 2016年07月23日 11:53
  • 518

PHP设计模式系列(一):策略模式

策略模式策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法...

php设计模式之策略模式

1.定义:将一组特定的行为和算法封装成类,以适应某些特定的上下文环境 2. 使用策略模式可以实现ioc,依赖倒置,控制反转...

PHP:设计模式之策略模式

策略模式是一种行为类模式。行为类模式用来说明一个应用是如何运作的。作为对比,工厂模式会改变对象的类型,而策略模式会立即改变一个算法。当我们使用的类比较简单,但是又不相互关联,只是在特定行为上有差异的时...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP设计模式之一策略模式
举报原因:
原因补充:

(最多只允许输入30个字)