ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-17 01:32:25  阅读:147  来源: 互联网

标签:function 组合 soldierType 模式 public soldier arm 举例说明


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

标签:function,组合,soldierType,模式,public,soldier,arm,举例说明
来源: https://www.cnblogs.com/yx520zhao/p/16279319.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有