2014-10-28 40 views
2

我在想如果在方法參數中爲操作定義回調比在對象中定義它並通過設置器設置更差(涉及關於設計模式),那是更糟糕的。設計模式:作爲方法參數的回調

我不確定是否存在有關回調創建的設計模式。

例如,假設存在一些類A,並且我想通過一些回調執行一個方法M.

public class A { 
    public interface Callback { 
     void onEvent(); 
    } 
    public static methodM(...) { 
     // ... 
    } 
} 

我可以做到這一點:

public static void methodM(Callback c) { 
    c.onEvent(); 
} 
// ... 
A.method(this); // The class that calls the method is the callback! 

相反的:

public static void setCallback(Callback callback) { 
    this.callback = callback; 
} 
public static void methodM() { 
    this.callback.onEvent(); 
} 
// ... 
A.setCallback(this); // The class that calls the method is the callback! 
A.method(); 

注意,該方法的事實是靜態的僅僅是簡單的場景理解。

那麼,我可以使用第一種方法作爲有效的設計嗎?

關於使用第一種情形的原因是爲了避免內存泄漏,以方便多個執行簡單的回調的定義,因爲我將不得不使用控制列表或者回調,觀察員的名單等

+0

高度依賴於類和方法的意圖。沒有*一個*模式。 – dcastro 2014-10-28 11:32:11

+0

我知道,過於通用,但我擔心第一種方法太壞/難以使用。由於我的回調是如此簡單的操作,我真的不想控制回調列表或類似的東西沒有需要。 – 2014-10-28 11:50:42

回答

1

我不認爲有一個「回調模式」,它太通用了。

然而,許多設計模式使用回叫,像Observer patternVisitor pattern

這將取決於你的程序

這段代碼

public static void methodM(Callback c) { 
    c.onEvent(); 
} 
// ... 
A.method(this); // The class that calls the method is the callback! 

不打擾我的全球架構,它不是被禁止的,如果像這樣呈現

1

我不認爲它不是模式的問題埠有幾條原則建議將回調存儲在一個類字段中。

  • 單一職責原則:不要告訴A他必須做什麼。
  • 得墨忒耳定律:沒有人知道A必須做什麼。
  • 打開關閉原則:您可能想在某些其他情況下在某一天調用回調。

還有一些其他的原則,但我認爲這些是最重要的。