您可以結合使用包裝和訪問者來解決您的問題。 使用包裝add a visit
方法允許您增加這些對象的可用性。當然,你可以獲得包裝器的全部優點(減少對傳統類的依賴)和缺點(附加對象)。
下面是JAVA一個工作機例如(因爲它是相當嚴格的,本身並不做雙調度,和我很熟悉了吧):
1)你的舊對象
假設你有你的舊對象Legacy1
和Legacy2
你不能變化,其中有具體的業務方法:
public final class Legacy1 {
public void someBusinessMethod1(){
...
}
}
和
public final class Legacy2 {
public void anotherBusinessMethod(){
...
}
}
2)準備包裝
你只是包裝他們在一個VisitableWrapper具有visit
方法是把你的訪客,如:
public interface VisitableWrapper {
public void accept(Visitor visitor);
}
隨着以下實現:
public class Legacy1Wrapper {
private final Legacy1 legacyObj;
public Legacy2Wrapper(Legacy1 original){
this.legacyObj = original;
}
public void accept(Visitor visitor){
visitor.visit(legacyObj);
}
}
和
public class Legacy2Wrapper {
private final Legacy2 legacyObj;
public Legacy2Wrapper(Legacy2 original){
this.legacyObj = original;
}
public void accept(Visitor visitor){
visitor.visit(legacyObj);
}
}
3)遊客,在準備好了!
然後自己遊客 s時,可以設置訪問像這樣的包裝:
public interface Visitor {
public void visit(Legacy1 leg);
public void visit(Legacy2 leg);
}
一個實現像這樣:
public class SomeLegacyVisitor{
public void visit(Legacy1 leg){
System.out.println("This is a Legacy1! let's do something with it!");
leg.someBusinessMethod1();
}
public void visit(Legacy2 leg){
System.out.println("Hum, this is a Legacy 2 object. Well, let's do something else.");
leg.anotherBusinessMethod();
}
}
4)釋放的動力
最後在你的代碼中,這個框架可以像這樣工作:
public class TestClass{
// Start off with some legacy objects
Legacy1 leg1 = ...
Legacy2 leg2 = ...
// Wrap all your legacy objects into a List:
List<VisitableWrapper> visitableLegacys = new ArrayList<>();
visitableLegacys.add(new Legacy1Wrapper(legacy1));
visitableLegacys.add(new Legacy2Wrapper(legacy2));
Visitor visitor = new SomeLegacyVisitor(); // Use any of your visitor implementation !
for(VisitableWrapper wrappedLegacy: visitableLegacys){
wrappedLegacy.accept(visitor);
}
}
預期的輸出:
This is a Legacy1! let's do something with it!
Hum, this is a Legacy 2 object. Well, let's do something else.
缺點:
- 相當多的樣板。如果使用Java開發,請使用Lombok。
- 相當多的包裝對象實例。可能會或可能不會成爲你的問題。
- 您需要事先知道對象的具體類型。這意味着你知道他們的子類型,他們不是捆綁在列表中。如果是這樣的話,你別無選擇,只能使用反射。
這是最絕對*不*的理由使用*任何*的模式。並且訪問者模式不被任何UML圖表描述。無論如何,不知道你在說什麼語言,甚至不可能討論實現。該語言是否支持泛型? Lambda表達式?它有動態功能嗎?所有這些允許你創建一個不需要雙重調度的訪問者 –
我已經提供了一些更多的上下文和語言(java)的詳細信息 –
@AdityaW什麼是你要實現的用例/用戶故事? –