关闭

PHP设计模式之一策略模式

标签: 设计模式php
188人阅读 评论(0) 收藏 举报
分类:

案例分析:

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

                          


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

负责开发的小坤同志,头一眼看到需求,说,哎呀,这还不简单,哥可是专门写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();
?>
这样就实现了低内聚高耦!
小坤童鞋,就这样去完成你的设计任务吧~~~~~~

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34608次
    • 积分:1003
    • 等级:
    • 排名:千里之外
    • 原创:64篇
    • 转载:19篇
    • 译文:0篇
    • 评论:3条
    最新评论