将流畅的界面与构建器模式一起使用

吉肯

我试图通过在下面创建人员构建器对象来理解流利的构建器模式。我已经编写了想要使用的代码,但是在实现它时遇到了问题。我的问题如下:

  1. 调用时HavingJob(),这将创建一个新作业,然后可以仅使用该作业的适用方法对其进行配置,并最终将其添加到此Jobs集合中。感觉应该返回它,以便可以在其上调用其他流畅的工作方法。不确定如何暂时实现该功能以允许在该级别及更高级别进行链接。
  2. 实施IJobBuilder方法时,我无权访问它们在HavingJob()方法中创建的特定作业,因为我需要返回,IJobBuilder以将流利的方法限制为仅与作业相关的方法。HavingJob()使那些特定的作业方法可以在仍允许链接的同时对特定作业进行操作的诀窍是什么
  3. 一旦走到以结尾的流畅路径IJobBuilder,我将无法再打电话Build()HavingJob()添加其他工作。答案是拥有一个IJobBuilder继承自的单独实现PersonBuilder吗?
    public class Person
    {
        public string Name { get; set; }
        public List<Job> Jobs { get; set; }
        public List<Phone> Phones { get; set; }
    }

    public class Phone
    {
        public string Number { get; set; }
        public string Usage { get; set; }
    }

    public class Job
    {
        public string CompanyName { get; set; }
        public int Salary { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var p = PersonBuilder
                .Create()
                    .WithName("My Name")
                    .HavingPhone("222-222-2222")
                        .WithUsage("CELL")
                    .HavingJob()
                        .WithCompanyName("First Company")
                        .WithSalary(100)
                    .HavingJob()
                        .WithCompanyName("Second Company")
                        .WithSalary(200)
                .Build();

            Console.WriteLine(JsonConvert.SerializeObject(p));
        }
    }

    public class PersonBuilder : IJobBuilder
    {
        protected Person Person;
        public PersonBuilder() { Person = new Person(); }
        public static PersonBuilder Create() => new PersonBuilder();
        public PersonBuilder WithName(string name)
        {
            Person.Name = name;
            return this;
        }

        public PersonBuilder HavingPhone(string phoneNumber)
        {
            // Need instance of phone
            return this;
        }

        public PersonBuilder WithUsage(string phoneUsage)
        {
            // Need instance of phone
            return this;
        }

        public IJobBuilder HavingJob()
        {
            // Need to create a job here and return it so that IJobBuilder methods work on specific instance right?
            return this;
        }

        public Person Build() => Person;

        public IJobBuilder WithCompanyName(string companyName)
        {
            // How do I set the company name if I don't have the job instance here
            job.CompanyName = companyName;
            return this;
        }

        public IJobBuilder WithSalary(int amount)
        {
            // How do I set the salary if I don't have a specific job instance here
            job.Salary = amount;
            return this;
        }
    }

    public interface IJobBuilder
    {
        IJobBuilder WithCompanyName(string companyName);
        IJobBuilder WithSalary(int salary);
    }
恩科西

单一责任原则(SRP)和关注点分离(SoC)

作业创建者应负责构建作业

public interface IJobBuilder {
    IJobBuilder WithCompanyName(string companyName);
    IJobBuilder WithSalary(int salary);
}

public class JobBuilder : IJobBuilder {
    private readonly Job job;

    public JobBuilder() {
        job = new Job();
    }

    public IJobBuilder WithCompanyName(string companyName) {
        job.CompanyName = companyName;
        return this;
    }

    public IJobBuilder WithSalary(int amount) {
        job.Salary = amount;
        return this;
    }

    internal Job Build() => job;
}

人形生成器应负责构建人形。

public class PersonBuilder {
    protected Person Person;
    
    private PersonBuilder() { Person = new Person(); }

    public static PersonBuilder Create() => new PersonBuilder();

    public PersonBuilder WithName(string name) {
        Person.Name = name;
        return this;
    }

    public PersonBuilder HavingJob(Action<IJobBuilder> configure) {
        var builder = new JobBuilder();
        configure(builder);
        Person.Jobs.Add(builder.Build());
        return this;
    }

    public Person Build() => Person;

}

在上述构建器中,它将工作的构建委托给其负责的构建器。

这导致以下重构

class Program {
    static void Main(string[] args) {
        var p = PersonBuilder
            .Create()
                .WithName("My Name")
                .HavingJob(builder => builder
                    .WithCompanyName("First Company")
                    .WithSalary(100)
                )
                .HavingJob(builder => builder
                    .WithCompanyName("Second Company")
                    .WithSalary(200)
                )
            .Build();

        Console.WriteLine(JsonConvert.SerializeObject(p));
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将构建器模式与所有参数强制一起使用?

来自分类Dev

如何将查询构建器与sum()列和groupBy一起使用

来自分类Dev

“方法'where'在null上调用。” 当将流构建器与Firestore抖动一起使用时

来自分类Dev

将装饰器模式与QWidget一起使用是否可行?

来自分类Dev

将服务器处理程序与模式对话框一起使用

来自分类Dev

将调解器模式与webpack和ES6模块一起使用导入导出

来自分类Dev

将调解器模式与MVC一起使用是否有用?

来自分类Dev

首先与查询构建器一起使用

来自分类Dev

将Sublime Text与cmake一起使用(构建系统)

来自分类Dev

将视图模型与存储库模式一起使用

来自分类Dev

如何将 processStrategy 与对象模式一起使用

来自分类Dev

将装饰器与类构造器一起使用

来自分类Dev

将OnItemLongClick侦听器与ListView一起使用

来自分类Dev

将TBitmapLinks与FireMonkey样式设计器一起使用

来自分类Dev

将选择器与csQuery一起使用

来自分类Dev

将变量与jquery选择器一起使用

来自分类Dev

如何将hparams与估算器一起使用?

来自分类Dev

将SuperLU稀疏求解器与RcppArmadillo一起使用

来自分类Dev

将OnItemLongClick侦听器与ListView一起使用

来自分类Dev

将条带与读卡器一起使用

来自分类Dev

与monger一起使用搜索模式

来自分类Dev

将构建器方法与服务方法结合在一起-不好的做法?

来自分类Dev

使用没有内部静态类的流畅的构建器模式进行工作流

来自分类Dev

包含声明的闭包不能与函数构建器“ ViewBuilder”一起使用

来自分类Dev

将第二个UIWindow与rootViewController一起使用时,界面旋转变黑

来自分类Dev

将第二个UIWindow与rootViewController一起使用时,界面旋转变黑

来自分类Dev

在构建发行版时,无法将NuGet与WIX一起使用

来自分类Dev

构建应用程序以将ViewModel与ReactiveCocoa一起使用

来自分类Dev

构建提示以扩展通知或将通知组与CodenameOne推送消息一起使用

Related 相关文章

  1. 1

    如何将构建器模式与所有参数强制一起使用?

  2. 2

    如何将查询构建器与sum()列和groupBy一起使用

  3. 3

    “方法'where'在null上调用。” 当将流构建器与Firestore抖动一起使用时

  4. 4

    将装饰器模式与QWidget一起使用是否可行?

  5. 5

    将服务器处理程序与模式对话框一起使用

  6. 6

    将调解器模式与webpack和ES6模块一起使用导入导出

  7. 7

    将调解器模式与MVC一起使用是否有用?

  8. 8

    首先与查询构建器一起使用

  9. 9

    将Sublime Text与cmake一起使用(构建系统)

  10. 10

    将视图模型与存储库模式一起使用

  11. 11

    如何将 processStrategy 与对象模式一起使用

  12. 12

    将装饰器与类构造器一起使用

  13. 13

    将OnItemLongClick侦听器与ListView一起使用

  14. 14

    将TBitmapLinks与FireMonkey样式设计器一起使用

  15. 15

    将选择器与csQuery一起使用

  16. 16

    将变量与jquery选择器一起使用

  17. 17

    如何将hparams与估算器一起使用?

  18. 18

    将SuperLU稀疏求解器与RcppArmadillo一起使用

  19. 19

    将OnItemLongClick侦听器与ListView一起使用

  20. 20

    将条带与读卡器一起使用

  21. 21

    与monger一起使用搜索模式

  22. 22

    将构建器方法与服务方法结合在一起-不好的做法?

  23. 23

    使用没有内部静态类的流畅的构建器模式进行工作流

  24. 24

    包含声明的闭包不能与函数构建器“ ViewBuilder”一起使用

  25. 25

    将第二个UIWindow与rootViewController一起使用时,界面旋转变黑

  26. 26

    将第二个UIWindow与rootViewController一起使用时,界面旋转变黑

  27. 27

    在构建发行版时,无法将NuGet与WIX一起使用

  28. 28

    构建应用程序以将ViewModel与ReactiveCocoa一起使用

  29. 29

    构建提示以扩展通知或将通知组与CodenameOne推送消息一起使用

热门标签

归档