仅在oop

时间:2018-10-16 05:34:54

标签: java oop uml encapsulation ooad

这是在员工与其经理之间的办公室中的一个简单场景。 在现实世界中,经理可以管理许多员工,但是为了简单起见 在这里考虑一位员工与其经理之间的情况

在这里经理和员工都具有名称属性

  • 经理只能更改他的名字
  • 员工只能更改他的名字

只有雇员具有指定属性

  • 只能由经理更改名称

对于上述情况,我创建了这个类图

enter image description here

使用Java代码实现上述情况,如下所示 (请注意,此代码为伪代码,并且不包含编排代码,语法可能是错误的)

class Manager{
  private String name;
  private Employee employee;


    //assign name and create association link between employee 
    Manager(Employee employee,String managerName ){
        this.employee    = employee;
        this.name        = managerName;
    }

    //manager can change his name
    private void changeName(String managerName){
        this.name = managerName;
    }


    //only manager can change Employee designation
    private void changeEmpDesignation(String empDesignation){
        this.employee.changeDesignation(empDesignation);
    }

}

/* --------------------------- */


class Employee{
    private String name;
    private String designation;

    Employee(String name ,String designation ){
        this.designation = designation;
        this.name        = name;
    }

    //only Employee can change his name 
    private void changeName(String empName){
        this.name = empName;
    }

    //only manager can change Employee designation
    public void changeDesignation(String empDesignation){
        this.designation = empDesignation;
    }

}

但是

  1. 在这里,我将Employee.changeName()方法设为私有,以防止经理更改员工姓名是否正确?
  2. changeDesignation()方法在Employee类中,可以自己访问Employee类,也可以访问Manager类,这意味着 经理可以更改员工的指定,而员工也可以更改他/她的指定,我想防止这种情况的发生,并使经理成为唯一可以更改员工指定的人。如何在代码中实现?

2 个答案:

答案 0 :(得分:1)

在这种情况下,有一些事情要考虑。即使您将其视为现实世界实体很有意义,但让一个对象更改另一个对象的状态通常不是一个好的OO实践。

话虽如此,如果您不希望任何其他班级更改一个班级的属性,则应将该字段设为私有,并且完全不提供设置器。

关于名称,除非是最终的,否则您不能真正阻止对象修改其属性,但是经理也无法更改它。

我想您可以拥有一个Designation类,并使其成为仅管理员可以实例化的类。但是即使那样,员工也可以将其设置为null。

或者您可以让Designation类持有对一个或多个员工的引用,那么只有管理者才能访问这些指定对象。

正如我所说,我认为这是OO建模并不真正适合现实世界的时期之一。类应负责其自身的状态,并对任何状态更改都拥有自己的一组规则。其他任何班级都只能要求或要求更改。

希望有帮助!

答案 1 :(得分:1)

好吧,我不知道您要查询的域或上下文,但是名称应是构造函数的一部分,而不是操作的参数。有可能更改名称的原因。但是在现实世界中,对象是在创建时被命名的,并一直保留到最后。私有changeName似乎毫无意义。

对于第二个项目符号,您需要添加约束{ can only be invoked by Manager instances }