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项目应用——策略模式设计商场收银系统

1 策略模式简介     策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。      2 模式组成     1)抽象策略角色(...
  • CleverCode
  • CleverCode
  • 2015年05月14日 16:30
  • 3796

Java设计模式之策略模式

本文属于23种设计模式系列。 介绍的是策略模式。
  • jason0539
  • jason0539
  • 2015年04月13日 07:20
  • 33546

行为型:设计模式之策略模式(十六)

俗话说:条条大路通罗马。在很多情况下,实现某个目标的途径不止一条,例如我们在外出旅游时可以选择多种不同的出行方式,如骑自行车、坐汽车、坐火车或者坐飞机,可根据实际情况(目的地、旅游预算、旅游时间等)来...
  • z742182637
  • z742182637
  • 2015年12月25日 11:15
  • 1397

设计模式之PHP项目应用(策略模式:自动驾驶系统)

  • 2015年05月14日 17:53
  • 4KB
  • 下载

设计模式之PHP项目应用(策略模式:商场收银系统)

  • 2015年05月14日 16:49
  • 5KB
  • 下载

PHP设计模式——策略模式

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

php设计模式之策略模式

经常听学Java的同学说起设计模式,今天开始接触一些php的设计模式,觉得策略模式挺有意思。其实使用设计模式的目的,大多是为了提高某种类或功能的可扩展性:这里的可扩展性对于Java和C++等强类型语言...
  • misakaqunianxiatian
  • misakaqunianxiatian
  • 2015年09月30日 09:25
  • 623

php设计模式之策略模式

在此模式中,算法是从复杂类提取的,因而可以方便地替换。 例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一...
  • starrykey
  • starrykey
  • 2016年07月27日 21:32
  • 93

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

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

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

在面向对象的入门课程C++(或者JAVA)中,封装数据和方法好像是面向对象最重要的一个特点,当然还有基于继承实现的多态和重载。其实每一种OOP语言,由于彼此功能上的差异性,这些特点只能适用于某一种特定...
  • acingdreamer
  • acingdreamer
  • 2017年03月05日 15:43
  • 3782
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP设计模式之一策略模式
举报原因:
原因补充:

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