2009-07-21 3 views
2

여기의 개체는 UI를 업데이트하는 것입니다. 나는 클라이언트에서 일반적으로 이것을하지만,이 애플리케이션은 코드를 뒤에서 사용한다. 어쨌든 내 질문은 이러한 진술을 정리하려고하고 전략 패턴이 적절하다고 생각합니다. 나는 나를 위해 모든 일을 할 필요는 없지만, 당신이 나에게 몇 가지 포인터를 줄 수 있다면. 먼저 인터페이스를 작성한 다음 각 전략이 인터페이스를 구현합니까? 제네릭이 여기에 도움이됩니까? 어떤 유형의 메소드가 인터페이스에 있어야합니까? 나에게 어떤 일이 있어도 대단히 감사 할 것입니다. 당신은 인터페이스와 전략 패턴을 사용하려고하는 경우리팩터 도움 - 전략 패턴

if (someObject.Status == 'A') { 
        btnRecordCall.Enabled = false; 
        btnAddMailOrStatusAction.Enabled = false; 
        btnPayments.Enabled = false; 
        btnAddressMaint.Enabled = false; 
        btnFilter.Enabled = false; 
        btnAddCoverage.Enabled = false; 
        btnPolicyForms.Enabled = false; 
        lblIsArchived.Text = "********** THIS CLAIM HAS BEEN ARCHIVED **********"; 
       } else if (someObject.Status == 'D') { 
        btnRecordCall.Enabled = false; 
        btnAddMailOrStatusAction.Enabled = false; 
        btnPayments.Enabled = false; 
        btnAddressMaint.Enabled = false; 
        btnFilter.Enabled = false; 
        btnAddCoverage.Enabled = false; 
        btnPolicyForms.Enabled = false; 
        lblIsArchived.Text = "- De-archive Request Pending"; 
       } else { 
        btnRecordCall.Enabled = true; 
        btnAddMailOrStatusAction.Enabled = true; 
        btnPayments.Enabled = true; 
        btnAddressMaint.Enabled = true; 
        btnFilter.Enabled = true; 
        btnAddCoverage.Enabled = true; 
        btnPolicyForms.Enabled = true; 
        lblIsArchived.Text = ""; 
       } 

덕분에, 는 ~ CK

답변

3

모든 음 첫째, 당신은이 같은 인터페이스를 할 수 있습니다.

public interface IStrategyUI 
{ 
    void Execute(); 
} 

public class StatusAStrategy : IStrategyUI 
{ 
    public void Execute() 
    { 
     //implement 
    } 
} 

다음 로직에 대한 몇 가지 클래스는 if 문은 기술적으로 공장이 될 수 있습니다.

IStrategyUI logic; 

switch(someObject.Status) 
{ 
    case 'A': logic = new StatusAStrategy(); 
      //etc etc 

} 

logic.Execute(); 

이 개체를 인터페이스로 반환하고 switch 문을 다른 메서드 나 팩토리 클래스에 캡슐화 할 수 있습니다.

이렇게 사용하면됩니다.

IStrategyUI logic = StrategyFactory.GetStrategy(status); 
logic.Execute(); 

귀하에게 달려 있습니다.

또한 여기는 봉쇄 수업을 사용하지 않지만 원하는 경우 할 수 있습니다.

위임자와 함께 할 수도 있습니다.

봉쇄 클래스

class StrategyHolder 
    { 
     public Action Strategy { get; set; } 

     public void Execute() 
     { 
      if(this.Strategy != null) 
       this.Strategy(); 
     } 
    } 

다른 전략 방법. 외부에서

void EnableStatusA() 
{ 
    //do everything for status A 
} 

스위치 문

StrategyHolder logic = new StrategyHolder(); 

switch(someObject.Status) 
    { 
     case 'A': logic.Strategy = EnableStatusA; 
       //etc etc 

    } 

return logic; 

콜이.

StrategyHolder logic = StrategyFactory.GetStrategy(status); 
logic.Execute(); 
+0

Stan. 구현의 execute 메소드에서 페이지 컨트롤에 대한 참조를 얻으려면 어떻게해야합니까? 페이지에 대한 참조를 전달하고 findcontrol ('someId')을 수행합니까? 또는 더 좋은 방법이 있습니까? – Hcabnettek

+0

예, 페이지 자체에 대한 참조를 전달한 다음 이전에했던 것과 동일한 작업을 수행 할 수 있습니다. 예 : page.lblIsArchived.Text = ""; 생성자 또는 Execute 메서드에서 Page에 대한 참조를 전달할 수 있습니다. 그것까지 너. –

3

모든 버튼이 표시되면 같은 당신의 예에서와 같이, 나는 버튼 목록에서 그 멀리 숨길 것하고 그냥 반복에 관계없이 상태 가능하게한다. 그런 다음 전략에 대한 매개 변수가 하나의 부울 및 문자열로 내려갑니다. 그리고 그 일을하기가 매우 쉽습니다. 보다 복잡한 경우에는 컨트롤을 설정하는 인터페이스를 구현하는 다른 클래스가 순서대로 배치되며 전체 논리를 보유하는 추상 수퍼 클래스가있을 수 있습니다.

+0

Carl 감사합니다. – Hcabnettek

0

당신이 찾고있는 것이 State 패튼이라고 생각합니다. 이는 각 상태 객체가 생성 될 때 컨텍스트 객체 (귀하의 경우에는 이것이 양식 임)에 대한 참조가 일반적으로 주어지는 것을 제외하고는 전략 패턴과 유사합니다. 이것에 의해, 다른 상태가 이벤트에 응답 해 컨텍스트 객체에 처리를 실시 할 수가 있습니다.

각 상태가 추상 기본 클래스에서 상속되도록하려면 상태 패턴을 구현하는 것이 좋습니다. 그런 다음 기본 클래스는 가상 메서드에 기본 작업을 구현할 수 있으며 각 상태마다 다른 작업 만 재정의해야합니다.

public interface IFormState 
{ 
    void EnableDisableControls(); 
} 

public class DefaultState : IFormState 
{ 
    private MyForm context; 

    public DefaultState(MyForm context) 
    { 
     this.context = context; 
    } 

    protected MyForm Context 
    { 
     get 
     { 
      return this.context; 
     } 
    } 

    public virtual void EnableDisableControls() 
    { 
     this.context.btnRecordCall.Enabled = true; 
     this.context.btnAddMailOrStatusAction.Enabled = true; 
     this.context.btnPayments.Enabled = true; 
     this.context.btnAddressMaint.Enabled = true; 
     this.context.btnFilter.Enabled = true; 
     this.context.btnAddCoverage.Enabled = true; 
     this.context.btnPolicyForms.Enabled = true; 
     this.context.lblIsArchived.Text = ""; 
    } 
} 

public class StateA : DefaultState 
{ 
    public StateA(MyForm context) 
     : base(context) 
    { 
    } 

    public override void EnableDisableControls() 
    { 
     base.EnableDisableControls(); 

     this.Context.lblIsArchived.Text = "********** THIS CLAIM HAS BEEN ARCHIVED **********"; 
     // etc... 
    } 
}