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


    组合模式 (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();`

  • 相关阅读:
    论云端智能相册应用的架构设计及应用
    《架构漫谈》阅读笔记02
    论软件体系架构之质量属性
    《架构漫谈》阅读笔记01
    tensorflow-gpu:Could not load dynamic library 'cusolver64_10.dll'; dlerror: cusolver64_10.dll not found
    tensorflow线性回归
    【阿里巴巴国际站】22届实习生招聘开始啦!
    vue-ref、js获取dom子元素
    echarts地图tooltip添加标注
    echarts 图表坐标axisLabel格式化文字
  • 原文地址:https://www.cnblogs.com/yx520zhao/p/16279319.html
Copyright © 2020-2023  润新知