案例分析:
原公司场景设计的项目构造需要更改,以前设计类结构如下
现在提出产品需求,在游戏的角色中添加一个玩具鸭子。
负责开发的小坤同志,头一眼看到需求,说,哎呀,这还不简单,哥可是专门写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();
?>
这样就实现了低内聚高耦!
小坤童鞋,就这样去完成你的设计任务吧~~~~~~