什么是组合模式?(举例说明)
发布:smiling 来源: PHP粉丝网 添加日期:2020-02-17 19:17:18 浏览: 评论:0
组合模式 (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();
Tags: 什么是组合模式
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)