除非注明转载,否则本博客文章皆为原创。 MSN: wfnlxp@hotmail.com QQ: 176564452

用星际学习PHP设计模式17-适配器模式

上一篇 / 下一篇  2007-06-20 09:29:21 / 个人分类:面向对象

星际的很多兵种,都有至少一项特殊技能。而且有些兵种的技能是相同的,比如虫族部队都会恢复血。

如果按照一般的思路,把技能的操作和控制作为方法,放在每个兵种的定义类来实现,代码会重复,也不容易修改。

那我们就会考虑用继承的办法,比如我们可以设计一个虫族的基类,里面有受伤后血恢复的方法。

在设计刺蛇(Hydralisk,口水兵)的时候,我们可以让刺蛇类继承虫族基类。

但是刺蛇是可以研发钻地的,而钻地不是刺蛇独有的功能,是虫族地面部队都有的特点,我们也要把钻地作为公共基类。

问题出来了,我们不能同时让刺蛇类继承两个类,这是php不允许的。

待解决的问题:如何混合重用两个类,

思路:继承一个类,把新建其中一个类的对象作为属性,然后通过这个属性来调用第二个类的方法。

适配器(Adapter)模式示例:

<?php

//虫族基类

class Zerg

{

  //血

  public $blood;

  //恢复血的方法

  public function restoreBlood()

  {

  //自动逐渐恢复兵种的血

  }

}

 

//钻地的类

class Burrow

{

  //钻地的方法

  public function burrowOperation()

  {

  //钻地的动作,隐形等等

   echo '我钻地了';

  }

}

 

//刺蛇的类

class Hydralisk extends Zerg

{

  //把一个属性来存放钻地对象

  public $burrow;

  //构造方法,因为php不允许默认值采用对象,所以通过初始化赋值给$burrow

  public function __construct()

  {

  $this->burrow=new Burrow();

  }

  //钻地的方法

  public function burrowOperation()

  {

  //调用钻地属性存放的对象,使用钻地类的方法

  $this->burrow->burrowOperation();

  }

}

 

//制造一个刺蛇

$h1 = new Hydralisk();

//让他钻地

$h1->burrowOperation();

?>

用途总结:适配器模式使得一个类可以同时使用两个基础类的功能,跳出了单纯继承的限制。有效的重用多各类。

实现总结:让新的类去继承一个基础类,然后通过新类的属性来存放其他类的对象,通过这些对象来调用其他类的方法。

 


TAG: PHP 设计模式 面向对象 适配器模式

lightsaber文锋--原创文章 引用 删除 lightsaber   /   2007-10-10 13:29:39
太好了,大家都来交流经验。
引用 删除 神仙   /   2007-10-10 10:29:02
这其实更适合用Decorate模式来做。

Adapter模式通常是用于与外部系统交互
随风的个人空间 引用 删除 szy_session1987   /   2007-06-21 10:08:33
你好强悍... 星际爱好者.
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar