深层成分和得墨忒耳定律

时间:2013-08-30 19:22:58

标签: oop design-patterns composition loose-coupling law-of-demeter

夜。我无法在某些深层构图的情况下找到合适的设计模式。让我举个例子。

假设我们有一类类型公司类,它有许多类型子公司类,它们有许多类型的类,类型包含许多类型的类,而这些类又包含许多类型为Employee的类。

现在,假设用例是计算每个公司的员工数量。我可以循环遍历每个公司,为每个子公司再循环,依此类推,依此类推,产生嵌套循环,深入4级。另外,我会通过在下面的几个级别引用我的类链来破坏得墨忒耳的法则,这样的东西非常紧密,它会破坏我修改链条的那一刻。

我能做的另一件事是添加吨(可能不是吨,但是一些)的快捷方式参考。例如,公司本身也可以包含员工列表,从而不必遍历链来计算它们。这样,类的耦合程度就会降低(但它们是什么?)现在的问题就是如何保持公司和单位的员工列表同步。我可以使用观察者模式来保持它们的更新我想但是我真的觉得这个想法有些可怕的错误,或者至少我没有真正使用那里的最佳解决方案。

由于我很确定这是一个非常常见的域名,任何人都可以帮我指出一个合适的设计模式吗?

感谢。

2 个答案:

答案 0 :(得分:1)

我没有完全回答第二个问题,但我正在回答第一个问题。

  

正如得墨忒耳法则规定每个实体应该最少   关于其他单位的知识

所以在你的设计中使用这个原则

class Corporation{

    //All the stuff about corporation

    //Don't ask for what's inside corporation
    public int countEmployees(){
        //will apply the logic needed to calculate
    }

}

使用得墨忒耳法的更好的客户端代码:

corporationInstance.countEmployees(); //let the corporation handle how to count and not expose inner details

没有得墨忒耳法则

corporationInstace.getSubsidiaries().getSomethingElse()..... //exposing the inner details of class which creates a chain that is bad.

<强>更新

使用上述解决方案,您可以根据需要在countEmployees()内和Subsidiaries内创建Unit方法,以获得任意深度。打破封装或使用Observer模式没有意义。

应用您自己在评论中指出的 Tell Don't ask 原则,并将计算实际员工的责任委派给包含员工的班级。

Department - > uses count method on subsidiaries to add their count
Subsidiaries - > uses Units to count
Unit - > Uses employees to count

答案 1 :(得分:0)

  

假设您要通过链接或按钮向客户发送电子邮件。您可以像customer.getSomeParticularContactInfo(addressType).sendEmail()或customer.sendEmail()一样编写它,然后(在Customer内部)调用getSomeParticularContactInfo(“primary”)。sendEmail()。

你走错了路。这打破了单一责任,我的意思是,客户对象不需要知道,如何发送电子邮件,客户对象只负责如何提供属于客户的电子邮件地址。因此,对于此功能,您需要创建另一个接口,如Notifier和一个实现Notifier的EmailNotifier。此后,您将致电EmailNotifier.notify(客户)