6

안녕하세요. 문제가 있습니다.중첩 된 개체가 포함 된 작성자 패턴

내 개체를 쉽게 만들 수 있도록 작성기 패턴을 구현하고 싶습니다. 내가 직면 한 문제는 중첩 된 객체와 관련이있다. 내가 만들고자하는 객체에는 그 안에있는 다른 객체의 목록이 있으며 실제로 다루는 방법에 대한 아이디어는 없습니다. 더 얻으면 있지만,

Receipt RestaurantReceipt = new ReceiptBuilder() 
.withDate("value") 
.withName("value") 
.AddItem("value", item => { 
    .WithIngredients("value") 
    .WithType("value") 
}) 
.AddItem("value", item => { 
    .WithIngredients("value") 
    .WithType("value") 
}) 
.build(); 

예 내 상황을 대표한다 : 같은

Receipt RestaurantReceipt = new ReceiptBuilder() 
.withDate("value") 
.withName("value") 
.AddItem("value") 
    .WithIngredients("value") 
    .WithType("value") 
.AddItem("value") 
    .WithIngredients("value") 
    .WithType("value") 
.build(); 

또는 뭔가 :

나는 다음 (예를 들어 간단한 물체를) 할 수 있도록하려면 한 유형의 중첩 된 객체보다

+1

나는? 아이템의 구조는 무엇입니까? AddItem으로 추가하려고합니까? – Jamiec

+0

일반적인 트릭은 인스턴스 자체를 해당 연산의 반환 값으로 반환하지 않습니까? 그래서 ... "... .AddFoo (new Foo(). WithIngredient ("value "). WithType ("value ")). ... "'? 해당 하위 유형에 대한 패턴을 반복하고 하위 모음 별 추가 기능/속성을 사용하십시오. – BitTickler

+0

'Receipt' 클래스를 보는데 도움이 되겠습니까 – konkked

답변

6

var rb = new ReceiptBuilder(); 
var receipt = rb.WithName("Name") 
      .WithDate(DateTime.Now) 
      .WithItem("Item1", i => i.WithIngredients("Ingredients1")) 
      .WithItem("Item2", i => i.WithIngredients("Ingredients1")) 
      .Build(); 
Console.WriteLine(receipt); 

같은

을 감안할 때 코드 빌더 꽤 간단하고, 소비자가 정상에 유사한 "빌더"패턴으로 각 항목을 구성 할 수 있도록 AddItem 빌더 방법 안에 몇 가지 간단한 조건을 활용 수준 ReceiptBuilder :

public class ReceiptBuilder 
{ 
    private Receipt r; 

    public ReceiptBuilder() 
    { 
     r = new Receipt(); 
    } 

    public ReceiptBuilder WithName(string name) 
    { 
     r.Name = name; 
     return this; 
    } 

    public ReceiptBuilder WithDate(DateTime dt) 
    { 
     r.Date = dt; 
     return this; 
    } 

    public ReceiptBuilder WithItem(string text, Action<ReceiptItemBuilder> itemBuilder) 
    { 
     var rib = new ReceiptItemBuilder(text); 
     itemBuilder(rib); 
     r.AddItem(rib.Build()); 
     return this; 
    } 

    public Receipt Build() 
    { 
     return r; 
    } 
} 

public class ReceiptItemBuilder 
{ 
    private ReceiptItem ri; 

    public ReceiptItemBuilder(string text) 
    { 
     ri = new ReceiptItem(text); 
    } 

    public ReceiptItemBuilder WithIngredients(string ings) 
    { 
     ri.Ingredients = ings; 
     return this; 
    } 

    // WithType omitted for brevity. 

    internal ReceiptItem Build() 
    { 
     return ri; 
    } 
} 

근무 예 : http://rextester.com/IRR50897`ReceiptBuilder` 모습 리터에 대한 귀하의 현재 코드를 무엇

관련 문제