设计模式之结构型模式—— 2.4 组合模式

<?php
/**
 * 2.4 组合模式
 * 定义:
 *      将对象组合成树形结构以表示“部分整体”的层次结构。
 *      组合模式使得用户对单个对象和组合对象的使用具有一致性
 * 角色:
 *      1. Component角色
 *          职责:它是组合中的对象接口。在适当的情况下,实现
 *                所有类共有接口的默认行为。声明一个接口用于
 *                访问和管理Component的子部件。
 *      2. Leaf角色
 *          职责:在组合中表示叶子节点对象,叶节点没有子节点
 *      3. Composite角色
 *          职责:定义有枝节点行为,用来存储子部件,在Component
 *                接口中失效与子部件有个的操作。比如增加Add
 *                和删除Remove。
 * 优点:
 *      1. 定义了包含基本对象和组合对象的类层次结构;
 *      2. 统一了组合对象和叶子对象;
 *      3. 简化了客户端调用;
 *      4. 更容易扩展.
 * 缺点:
 * 使用场景:
 *      1. 你想表示对象的部分—整体层次结构。
 *      2. 你希望用户忽略组合对象与单个对象的不同,用户将
 *         统一的使用的使用组合结构中的所有对象。
 */

//抽象公司类
abstract class Company{
    protected $name;
    public function __construct($name){
        $this->name=$name;
    }

    abstract public function add(Company $c);
    abstract public function remove(Company $c);
    abstract public function display($depth);
    abstract public function lineofduty();
}

//具体公司类
class ConcreteCompany extends Company{
    private $children=array();
    public function __construct($name){
        parent::__construct($name);
    }
    public function add(Company $c){
        if(! in_array($c, $this->children)){
            $this->children[]=$c;
        }
    }
    public function remove(Company $c){
        if(in_array($c, $this->children)){
            $pos=array_search($c,$this->children);
            unset($this->children[$pos]);
        }
    }
    public function display($depth){
        $str=‘__‘;
        for($i=0;$i<$depth;$i++){
            $str.=$str;
        }
        echo $str.$this->name.‘<br/>‘;
        foreach ($this->children as $c) {
            $c->display($depth+1);
        }
    }
    public function lineofduty(){
        foreach ($this->children as $c) {
            $c->lineofduty();
        }
    }
}

//人力资源部
class HRDepartment extends Company{
    public function __construct($name){
        parent::__construct($name);
    }
    public function add(Company $c){}
    public function remove(Company $c){}
    public function display($depth){
        $str=‘__‘;
        for($i=0;$i<$depth;$i++){
            $str.=$str;
        }
        echo $str.$this->name.‘<br/>‘;
    }
    public function lineofduty(){
        echo $this->name.‘:<br/>职责---员工的招聘培训管理‘.‘<br/><br/>‘;
    }
}

//财务部
class FinaceDepartment extends Company{
    public function __construct($name){
        parent::__construct($name);
    }
    public function add(Company $c){}
    public function remove(Company $c){}
    public function display($depth){
        $str=‘__‘;
        for($i=0;$i<$depth;$i++){
            $str.=$str;
        }
        echo $str.$this->name.‘<br/>‘;
    }
    public function lineofduty(){
        echo $this->name.‘:<br/>职责---公司财务收支管理‘.‘<br/><br/>‘;
    }
}

// 客户端
$root=new ConcreteCompany(‘北京总公司‘);
$root->add(new HRDepartment(‘总公司人力资源部‘));
$root->add(new FinaceDepartment(‘总公司财务部‘));

$comp1=new ConcreteCompany(‘上海华东分公司‘);
$comp1->add(new HRDepartment(‘华东分公司人力资源部‘));
$comp1->add(new FinaceDepartment(‘华东分公司财务部‘));
$root->add($comp1);

$comp2=new ConcreteCompany(‘南京办事处‘);
$comp2->add(new HRDepartment(‘南京办事处人力资源部‘));
$comp2->add(new FinaceDepartment(‘南京办事处财务部‘));
$comp1->add($comp2);

$comp3=new ConcreteCompany(‘杭州办事处‘);
$comp3->add(new HRDepartment(‘杭州办事处人力资源部‘));
$comp3->add(new FinaceDepartment(‘杭州办事处财务部‘));
$comp1->add($comp3);

$root->display(1);
$root->lineofduty();
时间: 2024-10-10 23:05:46

设计模式之结构型模式—— 2.4 组合模式的相关文章

设计模式-结构型模式,python组合模式

设计模式上大的方向上分继承和组合,就是类模式和对象模式.此篇的组合模式非继承和组合概念中的组合.桥接 策略 代理 装饰者都用了组合,此组合非彼组合. 组合模式 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构. 这种模式创建了一个包含自己对象组的类.该类提供了修改相同对象组的方式. 我们通过下面的实例来演示组合模式的用法.

设计模式4 结构型模式

设计模式4  结构型模式 目录 代理模式 装饰器 外观模式 适配器模式 代理模式,美国,韩国代理购物 [email protected]:~$ cat main.cpp  #include<iostream> using namespace std; class Item //商品 { public: Item(string kind ,bool fact) { this->kind = kind; this->fact = fact; } string getKind() { r

Java经典23种设计模式之结构型模式(二)

接上篇,本文介绍结构型模式里的组合模式.装饰模式.外观模式. 一.组合模式(Composite) 组合模式:将对象组合成树形结构,表示"部分--整体"的层次结构.最终达到单个对象和组合对象的使用具有一致性.单看这句话貌似有点抽象,其实比较简单. 以李云龙的独立团为例,目的要统计赵嘉宇一战共歼灭敌人多少个.最高的级别是团,一个团有若干个营,一个营有若干个排,一个排有若干个战士.(为了简化问题,排下面就不设行政单位了).很自然的,李云龙给营长开会回去给老子统计.营长回去给各个排长开会,赶紧

《设计模式》结构型模式1

上篇博文写了创建型模式中的(工厂家族).这次来介绍一下结构型模式.主要从各个模式的含义,优缺点,适用场合及结构图来了解结构型模式. 结构型模式包括有7种模式,适配器模式,外观模式,代理模式,桥接模式,享元模式,组合模式,装饰模式.每个模式各有优缺,孰优孰劣,请看下文. 1.适配器模式 定义:将一个类的接口转换成客户希望的另外一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构图: 适用于:想要使用一个已存在的类,但接口和你的要求不同时 在软件开发后期或是维护时期,在双方都不

设计模式总结-结构型模式

描述: 如何组合类和对象以获得最大的结构: 不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法: 分类: 适配器模式 http://blog.csdn.net/huo065000/article/details/22177651 装饰模式 http://blog.csdn.net/huo065000/article/details/22061403 代理模式 http://blog.csdn.net/huo065000/article/details/22177

Java经典23种设计模式之结构型模式(一)

结构型模式包括7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式其实很简单,就像手机充电器一样,手机需要5V的,而插座出来是220V.因此需要充电器变压就ok.再比如,一个之会说汉语的和一个只会说英语的无法沟通,那就中间请个翻译.所有的交流通过翻译,翻译翻给会说英语的,就能完成一次单项交流的.链接1 中的例子非常生动形象了.总结一下,无非就是有个通用的接口(称为Target),如果一切顺

&quot;围观&quot;设计模式(30)--结构型设计模式总结(适配器、代理、装饰、外观、桥梁、组合、享元)

设计模式代码下载地址 设计模式代码下载地址 1  适配器模式 在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper).将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.----WIKIPEDIA 个人理解 适配器模式:将两个不一致或者说无法直接使用的类或者接口通过适配器模式进行兼容,使得他们可以在一块使用.适配器模式在之前的项目中我是用于处理数据的不兼容的,对

【大话设计模式】——结构型模式总结

结构型设计模式主要是从结构上解决代码的耦合问题.包含一下7种模式:Adapter,Proxy,Composite,Bridge,flyweight,Facade,Decorator.结构型中包含7个模式,有点多,不过比行为型模式少,但也容易忘记,加点魔术粉让我们忘不了. 首先,我们要先知道这7个模式都是什么意思. 一.概念 1.Adapter:将一个类的接口转换为客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一起工作. 个人理解:看到这个模式让我想起了编码,

Java学习--设计模式之结构型模式(二)

一.装饰器模式(Decorator Pattern) 1.概念 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 2.简介 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引

设计模式(34)-----结构型模式-----桥接设计模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类.这两种类型的类可被结构化改变而互不影响. 我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法.其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆. 介绍 意图:将抽象部分与实现部分分离,使它们都可以独立的变化. 主要解决:在有多