PHP 设计模式(十三):组合模式

什么是组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

应用场景
  1. 在树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

  2. 组合模式让你可以优化处理递归或分级数据结构。

PHP 代码实现
<?php

/**
 * 单位战斗抽象类
 * Class Unit
 */
abstract class Unit
{
    function getComposite()
    {
        return null;
    }
    abstract function bombardStrength();
}

/**
 * 单位战斗扩展
 * Class CompositeUnit
 */
abstract class CompositeUnit extends Unit
{
    protected $units = [];

    public function getComposite()
    {
        return $this;
    }

    protected function units()
    {
        return $this->units;
    }

    /**
     * 移除单位
     * @param Unit $unit
     */
    public function removeUnit(Unit $unit)
    {
        $this->units = array_udiff($this->units, array($unit), function($a, $b){
            return ($a === $b) ? 0 : 1;
        });
    }

    /**
     * 添加单位
     * @param Unit $unit
     */
    public function addUnit(Unit $unit)
    {
        if (in_array($unit, $this->units, true)) {
            return;
        }
        $this->units[] = $unit;
    }
}

/**
 * 弓箭手
 * Class Archer
 */
class Archer extends CompositeUnit
{
    public function bombardStrength(){
        return 10;
    }
}


/**
 * 激光炮
 * Class LaserCanonUnit
 */
class LaserCanonUnit extends CompositeUnit
{
    public function bombardStrength(){
        return 20;
    }
}

/**
 * 骑兵对象
 * Class Cavalry
 */
class Cavalry extends CompositeUnit
{
    function bombardStrength(){
        return 30;
    }
}

/**
 * 军队为各个武器的组合
 * Class Army
 */
class Army extends CompositeUnit
{

    /**
     * 计算攻击强度
     * @return int
     */
    function bombardStrength(){
        $ret = 0;
        foreach ($this->units as $unit){
            $ret += $unit->bombardStrength();
        }

        return $ret;
    }
}

//=======================组合模式测试===============================

$main_army = new Army();
$main_army->addUnit(new Archer());
$main_army->addUnit(new LaserCanonUnit());

print "攻击强度:{$main_army->bombardStrength()}<br>";

$sub_army = new Army();
$sub_army->addUnit(new Archer());
$sub_army->addUnit(new Cavalry());
$sub_army->addUnit(new LaserCanonUnit());

$main_army->addUnit($sub_army);

print "攻击强度:{$main_army->bombardStrength()}<br>";

//结果
//攻击强度:30
//攻击强度:90

参考书籍【深入PHP:面向对象、模式与实践(第三版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值