• 技术文章 >后端开发 >php教程

    什么是组合模式?(举例说明)

    藏色散人藏色散人2019-04-16 09:56:22转载1914
    组合模式 (Composite Pattern)

    组合模式:允许客户将对象组合成树形结构来表现"整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

    组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。

    包含其他组件的组件为组合对象;不包含其他组件的组件为叶节点对象。

    组合模式为了保持”透明性“,常常会违反单一责任原则。也就是说,它一方面要管理内部对象,另一方面要提供一套访问接口。

    当组合模式接口里提供删除子节点的方法时,在组件里有一个指向父节点的指针的话,实现删除操作会比较容易。

    以一个军队的战斗力计算为例演示组合模式

    军队由步兵、炮兵、特种兵组成,他们都具备一个能力就是战斗并具备各自的战斗力。我们通过他们组合成一个军队并完成战斗力的计算。

    <?php
    //抽象士兵类
    interface soldier{
    public function fire();
    }
    //步兵 攻击力5
    class bubing implements soldier{
    public function fire(){
    return 5;
    }
    }
    //炮兵 攻击力8
    class paobing implements soldier{
    public function fire(){
    return 8;
    }
    }
    //特种兵 攻击力 12
    class tezhongbing implements soldier{
    public function fire(){
    return 12;
    }
    }
    //军队类实现兵种的组合
    class arm{
    //存储作战兵种的数组 
    private $soldier = array();
    //添加作战兵种
    public function add($soldierType){
    //获取对应的兵种对象
    $soldier  = new $soldierType();
    //保存进数组利用数组的键记录兵种 便于删除
    $this->soldier[$soldierType] = $soldier;
    }
    //删除兵种
    public function delete($soldierType){
    if(isset($this->soldier[$soldierType])){
    unset($this->soldier[$soldierType]);
    }
    }
    //计算并输出战斗能力
    public function show(){
    $zhantouli = 0;
    foreach($this->soldier as $v){
    $zhantouli += $v->fire();
    }
    echo "军队的战斗力: ".$zhantouli;
    }
    }
    $arm = new arm();
    $arm->add('bubing');
    $arm->add('paobing');
    $arm->show();
    $arm->delete('paobing');
    $arm->show();

    以上就是什么是组合模式?(举例说明)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:hcoder,如有侵犯,请联系admin@php.cn删除
    专题推荐:组合模式
    上一篇:PHP面向对象特性 下一篇:外观模式的作用
    大前端线上培训班

    相关文章推荐

    • PHP访问者模式与组合模式详解• PHP设计模式之组合模式与案例分享• PHP组合模式详解及案例• PHP面向对象中访问者模式和组合模式详解

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网