문맥
객체 계층 구조 (표현식 트리)에서 "의사"방문자 패턴 (이중 디스패치를 사용하지 않는 의사)을 사용했습니다.
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
그러나 MyInterface의 구현 수가 상당수 (~ 50 이상)이고 추가 작업을 추가 할 필요가 없기 때문에이 디자인은 의문의 여지가 없었으며 매우 편안했습니다.
각 구현은 고유하며 (다른 표현식 또는 연산자 임) 일부는 복합입니다 (예 : 다른 연산자 / 리프 노드를 포함하는 연산자 노드).
순회는 현재 트리의 루트 노드에서 Accept 작업을 호출하여 수행됩니다. 트리 노드는 차례로 각 하위 노드에서 Accept를 호출합니다.
그러나 예쁜 인쇄와 같은 새로운 작업 을 추가 해야 할 시점이 왔습니다 .
public class MyImpl : MyInterface
{
// Property does not come from MyInterface
public string SomeProperty { get; set; }
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
public void Accept(SomePrettyPrinter printer)
{
printer.PrettyPrint(this.SomeProperty);
}
}
기본적으로 두 가지 옵션이 있습니다.
- 유지 관리 비용 (옵션이 아닌 IMHO)을 희생하여 각 파생 클래스에 새로운 작업 방법을 추가하여 동일한 디자인을 유지합니다.
- 확장 성을 희생시키면서 "참된"방문자 패턴을 사용하십시오 (추가 구현이 필요할 것으로 예상되므로 옵션이 아닙니다 ...). ?
질문
방문자 패턴을 사용하여 다시 명령 하시겠습니까? 이 문제를 해결하는 데 도움이되는 다른 패턴이 있습니까?
MyInterface
.. 그 모든 클래스는 고유 한 구현을해야합니까 DoSomething
그리고 DoSomethingElse
? 당신의 방문자 클래스는 실제로 계층 구조를 통과 어디 표시되지 않습니다 - 그것은 더 많은처럼 보이는 facade
순간 ..