0

我正在尝试构建一个简单的组合模式示例。基本上输出将是每个部门员工的总智能。我创建了 3 种类型的员工和 2 个部门。请参阅以下代码:

员工类

abstract class Employee {

    function addEmployee(Employee $employee){

    }

    function removeEmployee(){

    }

    abstract function showIntelligent();

}

奴才类

class Minion extends Employee {

       function showIntelligent(){
          return '100';
    } 


}

经理班

class Manager extends Employee {

    function showIntelligent(){
           return '150';
    } 



}

营业部班

class SalesDept extends Employee {

     private $_deptEmployee=array();
    function addEmployee(Employee $employee){

        $this->_deptEmployee[]=$employee;

    }

    function removeEmployee(){
        if(!empty($this->_deptEmployee)){
            array_pop($this->_deptEmployee);
        }else{
            echo 'no employees in Sales Department';
        }
    }

    function showIntelligent() {

        $totalInt=0;
        foreach ($this->_deptEmployee as $employee){

            $totalInt += $employee->showIntelligent();
        }
        echo 'Total Intelligent of the Sales Department Employees is: '.$totalInt;
    }

}

设计系班

class DesignDept extends Employee {

     private $_deptEmployee=array();
    function addEmployee(Employee $employee){

        $this->_deptEmployee[]=$employee;

    }

    function removeEmployee(){
        if(!empty($this->_deptEmployee)){
            array_pop($this->_deptEmployee);
        }else{
            echo 'no employees in Design Department';
        }
    }

   function showIntelligent() {

        $totalInt=0;
        foreach ($this->_deptEmployee as $employee){

            $totalInt += $employee->showIntelligent();
        }
        echo 'Total Intelligent of the Design Department Employees is: '.$totalInt;
    }


}

我的索引

    $salesDpt=new SalesDept();
    $salesDpt->addEmployee(new Manager());
    $salesDpt->addEmployee(new Minion());
    $salesDpt->addEmployee(new Minion());
    $salesDpt->addEmployee(new GeneralManager());

    $salesDpt->showIntelligent();



    $DesignDpt=new DesignDept();
    $DesignDpt->addEmployee(new Manager());
    $DesignDpt->addEmployee(new Manager());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new GeneralManager());

    $DesignDpt->showIntelligent();

看来我必须使用大量代码来添加新员工。这是一个好习惯吗?无论如何要改进它?感谢您的任何建议。

4

2 回答 2

1

您可以更改 addEmployee() 方法以采用整数计数参数。

这可以将 7 行代码减少到以下内容:

$DesignDpt->addEmployee(new Minion(), 7);
于 2012-05-17T20:55:12.723 回答
1

我有很多意见——其中一些已经被提及。

1) 拥有一个带有 Minion 和 Manager 子类的 Employee 类不是一个好主意。这里的问题是 Minions 可以被提升为经理,这不应该要求你扔掉旧对象并用新对象替换它们。相反,为 Employee 设置一个类,其中包含一个包含 MinionRole 或 ManagerRole 的“角色”实例变量。通过这种设计,您可以替换角色而无需替换整个 Employee 对象。事实上,从您到目前为止所描述的内容来看,您根本不需要角色 - 只是智能的一个实例变量。

2) 部门类不应该从 Employee 继承。部门不是员工,不能用作员工的替代品。创建一个名为 Department 的新类。你真的需要子类吗?如果添加会计部门,是否真的需要修改、重新编译、重新打包和重新部署应用程序?

子类化仅在子类具有不同行为时才有用。在您的情况下,子类具有相同的行为或足够接近一个简单的实例变量可以使其工作。不要对继承过于兴奋。继承并不是所有问题的答案,应该谨慎使用。Alan Kay,Smalltalk 编程语言的创造者和创造“面向对象”一词的人从不喜欢继承的概念,只是不情愿地接受它以实现更好的代码共享。

于 2012-05-18T01:44:56.070 回答