`

树状的组合模式(composite pattern)

阅读更多

一个公司是由每一个工作的成员组成,每一个成员有不同的属性(名字,职位,薪水),根据不同的等级,构成一个树形的结构。总经理是这个棵树的根节点,因为他没有上级,部门经理是树枝节点,因为他既有上级也有下级,小喽啰是叶节点,因为他是最底层的苦逼,没有下级。现用组合模式将这个树展示出来,类图:



代码如下:

<?php
abstract class Corp {
	private $name = '';
	private $position = '';
	private $salary = 0;
	public function __construct( $name, $position, $salary ) {
		$this->name = $name;
		$this->position = $position;
		$this->salary = $salary;
	}
	public function getInfo() {
		$return = "姓名:".$this->name."\t";
		$return .= "职位:".$this->position."\t";
		$return .= "薪水:".$this->salary."\n";
		return $return;
	}
}

class Leaf extends Corp{
}

class Branch extends Corp{
	private $subordinateList = array();
	public function addSubordinate(Corp $corp){
		array_push($this->subordinateList, $corp);
	}
	public function getSubordinateList(){
		return $this->subordinateList;
	}
}

$root = new Branch('马总','总经理',100000);
$branch1 = new Branch('罗总','研发部门经理',20000);
$branch2 = new Branch('高总','销售部门经理',80000);
$leaf1 = new Leaf('张三','开发人员',7000);
$leaf2 = new Leaf('李四','开发人员',8000);
$leaf3 = new Leaf('二蛋','销售人员',10000);
$leaf4 = new Leaf('狗子','销售人员',15000);

$root->addSubordinate($branch1);
$branch1->addSubordinate($leaf1);
$branch1->addSubordinate($leaf2);
$root->addSubordinate($branch2);
$branch2->addSubordinate($leaf3);
$branch2->addSubordinate($leaf4);

function getTreeInfo($branch){
	echo $branch->getInfo();
	$subordinateList = $branch->getSubordinateList();
	foreach ($subordinateList as $value) {
		if($value instanceof Branch){
			getTreeInfo($value);
		}else{
			echo $value->getInfo();
		}
	}
}
getTreeInfo($root);
?>
运行结果:
姓名:马总	职位:总经理	薪水:100000
姓名:罗总	职位:研发部门经理	薪水:20000
姓名:张三	职位:开发人员	薪水:7000
姓名:李四	职位:开发人员	薪水:8000
姓名:高总	职位:销售部门经理	薪水:80000
姓名:二蛋	职位:销售人员	薪水:10000
姓名:狗子	职位:销售人员	薪水:15000
[Finished in 0.1s]

 

组合模式的定义

组合模式也叫合成模式,也叫部分-整体模式,主要是用来描述部分与整体的关系。其定义为:将对象组合成树形结构以表示”部分-整体“的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式主要由三个角色构成

1、Component抽象构件角色

定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性,比如例子中的Corp类。

2、Leaf叶子构件

3、Composite树枝构件

组合树枝节点和叶子节点形成一个树形结构

 

 

 

组合模式的优点

1、高层模块调用简单

一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。

2、节点自己增加

只要找到它的父节点就成,非常容易扩展,符合开闭原则

 

 

组合模式的缺点

组合模式有一个非常明显的缺点,看到在场景类中的定义,提到树叶和树枝使用时的定义了吗?直接使用了实现类!这在面向接口编程上是很不恰当的,与依赖代表团原则冲突,限制了接口中的影响范围。

 

 

组合模式的使用场景

1、维护和展示部分-整体关系的场景,如树形菜单、文件、文件夹管理。

2、从一个整体中的能够独立出总价模块或功能的场景。

 

 

组合模式的注意事项

只要是树形结构,就要考虑使用组合模式,这个一定要记住,只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,就应该考虑一下组合模式。

 

 

组合模式的扩展

1、真实的组合模式(略过)

2、透明的组合模式

例子中是安全的组合模式,透明模式是把用来组合的方法放到抽象类中(略过)

3、组合模式的遍历

例子中实现了树的从上级向下级遍历,如果现随便选中一个叶节点,如何向上级做遍历?



 其实也很简单,只要在添加节点时设置其父节点既可,代码如下:

<?php
abstract class Corp {
	private $name = '';
	private $position = '';
	private $salary = 0;
	private $parent = null;
	public function __construct( $name, $position, $salary ) {
		$this->name = $name;
		$this->position = $position;
		$this->salary = $salary;
	}
	public function getInfo() {
		$return = "姓名:".$this->name."\t";
		$return .= "职位:".$this->position."\t";
		$return .= "薪水:".$this->salary."\n";
		return $return;
	}
	public function setParent($parent){
		$this->parent = $parent;
	}
	public function getParent(){
		return $this->parent;
	}
}

class Leaf extends Corp{
}

class Branch extends Corp{
	private $subordinateList = array();
	public function addSubordinate(Corp $corp){
		$corp->setParent($this);
		array_push($this->subordinateList, $corp);
	}
	public function getSubordinateList(){
		return $this->subordinateList;
	}
}

$root = new Branch('马总','总经理',100000);
$branch1 = new Branch('罗总','研发部门经理',20000);
$branch2 = new Branch('高总','销售部门经理',80000);
$leaf1 = new Leaf('张三','开发人员',7000);
$leaf2 = new Leaf('李四','开发人员',8000);
$leaf3 = new Leaf('二蛋','销售人员',10000);
$leaf4 = new Leaf('狗子','销售人员',15000);

$root->addSubordinate($branch1);
$branch1->addSubordinate($leaf1);
$branch1->addSubordinate($leaf2);
$root->addSubordinate($branch2);
$branch2->addSubordinate($leaf3);
$branch2->addSubordinate($leaf4);


function getParentInfo($leaf){
	echo $leaf->getInfo();
	$parent = $leaf->getParent();
	if($parent instanceof branch)
		getParentInfo($parent);
}
getParentInfo($leaf4);
?>
运行结果:
姓名:狗子	职位:销售人员	薪水:15000
姓名:高总	职位:销售部门经理	薪水:80000
姓名:马总	职位:总经理	薪水:100000
[Finished in 0.2s]

 代码中黑体部分为与上一例的区别。

  • 大小: 6.2 KB
  • 大小: 7.3 KB
2
1
分享到:
评论
2 楼 home198979 2014-04-18  
freezingsky 写道
我只能说,最后的输出结果,很让人高兴。

??什么意思??结果哪里有错?
1 楼 freezingsky 2014-04-18  
我只能说,最后的输出结果,很让人高兴。

相关推荐

    组合模式 Composite Pattern

    **组合模式**(Composite Pattern)是一种常用的结构型设计模式,主要用于构建具有层次结构的对象系统。它允许客户端以一致的方式处理单个对象和组合对象,简化了高层模块的调用。通过组合模式,可以将多个对象组织成...

    设计模式之组合模式(Composite Pattern)

    组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...

    Composite Pattern(组合模式)

    例如,`Composite Pattern.oob`可能展示了Component、Composite和Leaf类的关系,而`Composite Pattern.oom`可能包含了一些示例对象的实例,展示如何通过组合模式构建树形结构并执行操作。 **使用和优势** 组合模式...

    c++-设计模式之组合模式(Composite Pattern)

    组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,这种模式常用于需要处理树形结构的数据...

    组合模式(Composite Pattern)原理图

    组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...

    设计模式面面观(11):组合模式(Composite Pattern)-结构型模式

    **设计模式面面观:组合模式(Composite Pattern)** 组合模式是软件工程中的一种结构型设计模式,它允许我们以树形结构来表示部分与整体的关系,使得客户端代码可以一致地处理单个对象和对象组合。在组合模式中,...

    Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现

    迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)是设计模式中的两种重要结构型模式,它们在软件设计中有着广泛的应用。这两种模式都属于GoF(Gang of Four)设计模式,旨在解决特定的问题,提升代码...

    CompositePattern.rar

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体层次关系,使得客户端代码可以统一地处理单个对象和对象组合。在C++中,组合模式可以帮助我们构建灵活且易于操作的对象结构。 首先,组合模式...

    设计模式_组合模式.zip

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

    java常用设计模式-组合模式

    组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中,有两种基本类型的对象:叶...

    .NET设计模式(11):组合模式(CompositePattern)

    [GOF《设计模式》]图1Composite模式结构图组合模式将对象组合成树形结构以表示"部分-整体"的层次结构。让用户一致地使用单个对象和组合对象。虽然例子抽象一些,但是算术表达式确实是组合的例子。算术表达式包括操作...

    C++设计模式课件20_Composite_组合模式.pdf

    组合模式(Composite Pattern)是一种树形结构的设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以对单个对象和组合对象进行一致性的操作处理,即客户程序可以像操作单个对象...

    c++设计模式-结构型模式-组合模式

    组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构...

    [结构型模式] 组合模式的理解

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们能够以一致的方式来处理单个对象和对象的组合。在组合模式中,单个对象和组合对象都被视为同一类型,这使得客户端代码可以对...

    设计模式实验报告-组合模式.docx

    组合模式(Composite Pattern)是一种结构型设计模式,它允许用户将对象组合成树形结构来表示部分-整体层次结构。该模式使得用户对单个对象和组合对象的使用具有一致性。 #### 实验内容 实验内容主要包括设计和实现...

    组合模式二叉树,前序、中序、后续,迭代器模式访问遍历

    通过组合模式,我们能够轻松地管理树形结构,而迭代器模式则提供了灵活且统一的遍历机制。这些概念不仅适用于Java,也是面向对象编程中的通用最佳实践。理解和掌握这些知识点,对于提升软件开发能力具有极大的帮助。

    Composite模式

    开发者可以利用这一模式来构建灵活且可扩展的软件系统,尤其是在需要表示树形结构或图形用户界面组件时。例如,在GUI库中,窗口(Window)、面板(Panel)和按钮(Button)可以被设计为复合对象,使得我们可以轻松地...

    iOS 设计模式 组合模式

    组合模式是一种设计模式,它属于结构型模式,主要用于将对象组织成树形结构,使得用户可以对单个对象和对象组合进行一致的操作。在iOS开发中,尤其在处理层次结构的数据或者组件时,组合模式显得尤为重要。这个...

    C++设计模式课件20_Composite_组合模式_Help!_designmodel_tenqqq_

    **组合模式(Composite Pattern)**是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得客户端可以统一地处理单个对象和对象的组合。在C++编程中,这种模式常用于简化对复杂对象结构的操作,...

Global site tag (gtag.js) - Google Analytics