zoukankan      html  css  js  c++  java
  • PHP设计模式之组合模式

    组合模式适应于当我们的一个对象可能代表一个单一的实体,或者一个组合实体,但是仍然需要通过同样的方式被使用的情形

    组合和聚合都描述了一个类长期持有其他类的一个或多个实例的情况。

    聚合:被包含对象是容器的核心部分,但是他们也可以被其他对象所包含。聚合关系用一条以空心菱形开头的线来说明。

    组合:被包含的对象只能被它的容器所引用。当容器被删除时,它也应该被删除。组合关系的菱形是实心的。

    <?php
    /**
    *File name: WorkUnit.php
    *Created by: ShowJoy
    *Contact: 734578348@qq.com, xubiao522@gmail.com
    *Last modified: 2014-5-24
    */
    
    abstract class WorkUnit{
        protected $tasks = array();
        protected $name = NULL;
        
        function __construct($name){
            $this->name = $name;
        }
        
        function getName(){
            return $this->name;
        }
        
        abstract function add(Employee $e);
        abstract function remove(Employee $e);
        abstract function assignTask($task);
        abstract function completeTask($task);
    }
    
    class Team extends WorkUnit{
        private $_employees = array();
        
        function add(Employee $e){
            $this->_employees[] = $e;
            echo "<p>{$e->getName()} has been added to team {$this->getName()}.</p>";
        }
        
        function remove(Employee $e){
            $index = array_search($e, $this->_employees);
            unset($this->_employees[$index]);
            echo "<p>{$e->getName()} has been removed from team {$this->getName()}.</p>";
        }
        
        function assignTask($task){
            $this->tasks[] = $task;
            echo "<p>A new task has been assigned to team {$this->getName()}. It should be easy to do with {$this->getCount()} team member(s).</p>";
        }
        
        function completeTask($task){
            $index = array_search($task, $this->tasks);
            unset($this->tasks[$index]);
            echo "<p>The '$task' task has been completed by team {$this->getName()}.</p>";
        }
        
        function getCount(){
            return count($this->_employees);        
        }
    }
    
    class Employee extends WorkUnit{
        function add(Employee $e){
            return false;
        }
        
        function remove(Employee  $e){
            return false;
        }
        
        function assignTask($task){
            $this->tasks[] = $task;
            echo "<p>A new task has been assigned to {$this->getName()}. It will be done by {$this->getName()} alone.</p>";
        }
        
        function completeTask($task){
            $index =  array_search($task, $this->tasks);
            unset($this->tasks[$index]);
            echo "<p>The '$task' task has been completed by employee {$this->getName()}.</p>";
        }
    }
    ?
    <?php
    /**
    *File name: compsite.php
    *Created by: ShowJoy
    *Contact: 734578348@qq.com, xubiao522@gmail.com
    *Last modified: 2014-5-24
    */
    
    require 'WorkUnit.php';
    
    $team = new Team('showjoy');
    $e1 = new Employee('xu');
    $e2 = new Employee('biao');
    $e3 = new Employee('god');
    
    $team->add($e1);
    $team->add($e2);
    $team->add($e3);
    
    $team->assignTask('do something by team');
    $e1->assignTask('do it alone');
    
    $team->completeTask('do something by team');
    $e1->completeTask('do it alone');
    unset($team,$e1,$e2,$e3); ?>
  • 相关阅读:
    排序算法
    【转】《分享一下我研究SQLSERVER以来收集的笔记》未整理
    D3.js学习记录
    D3.js学习记录【转】【新】
    JAVA FILE or I/O学习
    JAVA GUI学习
    android一键锁屏
    源文件如何转换到可执行文件
    手动搭建maven项目
    ThinkingInJava----第11章 持有对象
  • 原文地址:https://www.cnblogs.com/ShowJoy/p/3749315.html
Copyright © 2011-2022 走看看