流畅接口(方法链)与反向导航

3

我需要构建一个类,它可以使用方法链。我理解方法链的概念。例如:

class Company
{
    private String companyName;
    public setCompanyName(String companyName)
    {
        this.companyName = companyName;
        return this;
    }

    public Person addPerson(String name)
    {
         person = new Person();
         person.setName(name);

         return person;
    }
}

class Person
{
    private String name;
    private String address;
    private bool license

    public Person setName(String name)
    {
        this.name = name;
        return this;
    }

    public Person hasDriverLicense(bool license)
    {
        this.license = license;
        return this;
    }

    public Person setAddress(String address)
    {
        this.address = address;
        return this;
    }
}

//in some other class / method i do:
Company company = new Company()
.setCompanyName("SomeCompany")
.addPerson("Mike")
.setAddress("Street 118");

但我需要更进一步。我需要能够做到这一点:
Company company = new Company()
.setCompanyName("SomeCompany")
.addPerson("Mike")
.setAddress("Street 118");
.addPerson("Jane")
.setAddress("Street 342");
.hasDriverLicense(true)

所以,正如您所看到的,我需要能够继续链接。方法addAddress并不总是在链中的最后一个方法。它可以是Person类中的任何方法。
有没有好的方法来实现这个功能?也许可以使用方法扩展或其他什么东西?
非常感谢任何帮助/示例。

5
我得问一下……为什么你想把所有这些方法都连成一个连续的序列?难道你不能只存储公司信息,然后多次调用addPerson方法吗?像这样:var company = ...; company.addPerson(...).setAddress(...); company.addPerson(...).setAddress(...); - Marc Gravell
2
甚至可以使用对象/集合初始化器吗? var company = new Company { Name = "SomeCompany", People = { new Person {Name = Mike", Address = "Street 118"}, new Person {Name="Jane", Address = "Street 342", HasDriverLicence = true}}};(在IDE中看起来比压缩成一个注释要漂亮!) - Marc Gravell
1个回答

3

可以这样做。但这并不意味着你应该这样做:

Person和Company的方法应该返回一个对象,该对象在上下文中聚合了Person和Company。如果你有IPerson接口和ICompany接口,那么此类型将实现两个接口,内部持有对两个接口的引用,并会适当地分派调用(对IPerson方法的调用将被委托给内部的IPerson)。

话虽如此,我强烈不建议你走这条路。这很容易混淆,非常难以调试,而且违反基本的面向对象原则(例如接口隔离)。


2
谢谢,因为你和我收到的评论,我现在确定应该采取不同的方法。 - w00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接