Kontekst
Używałem z hierarchią obiektów (drzewa wyrażeń) wzorca „pseudo” użytkownika (pseudo, ponieważ w nim nie stosuje podwójnej wysyłki):
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
Ten projekt był jednak wątpliwy, całkiem wygodny, ponieważ liczba implementacji MyInterface jest znacząca (~ 50 lub więcej) i nie musiałem dodawać dodatkowych operacji.
Każda implementacja jest unikalna (jest to inne wyrażenie lub operator), a niektóre są kompozytami (tj. Węzłami operatora, które będą zawierać inne węzły operatora / liści).
Przechodzenie jest obecnie wykonywane przez wywołanie operacji Accept w węźle głównym drzewa, który z kolei wywołuje Accept na każdym z jego węzłów potomnych, który z kolei ... i tak dalej ...
Ale nadszedł czas, aby dodać nową operację , na przykład ładny druk:
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);
}
}
Zasadniczo widzę dwie opcje:
- Zachowaj ten sam projekt, dodając nową metodę mojej operacji do każdej klasy pochodnej, kosztem konserwacji (nie opcja, IMHO)
- Użyj „prawdziwego” wzorca gościa, kosztem rozszerzenia (nie jest to opcja, ponieważ spodziewam się, że po drodze pojawi się więcej implementacji ...), z około 50+ przeciążeniami metody Visit, z których każda odpowiada konkretnej implementacji ?
Pytanie
Czy poleciłbyś użycie wzorca gościa? Czy jest jakiś inny wzorzec, który mógłby pomóc rozwiązać ten problem?
MyInterface
… czy wszystkie te klasy mają unikalną implementację DoSomething
i DoSomethingElse
? Nie wiem, gdzie faktycznie twoja klasa gości przemierza hierarchię - facade
w tej chwili wygląda to bardziej jak