2009-12-15 72 views
1

基本上,我想要類似於: class DataProcessor { };但是,將來,我需要將DataProcessor的實例傳遞給其他函數,因爲DataProcessor包含一些關鍵數據。有沒有一種設計模式將'方法'從成員中分離出來?

我記住了是將成員方法分離:

class DataProcessorCore{}; 
class DataProcessor : public DataProcessorCore {}; 

這是做好這項工作的常用方法?或者有一些模式可以讓我的想法適應?

非常感謝

+0

我想,通過「會員」你的意思是「性」,對不對? – Konamiman 2009-12-15 08:29:32

+0

恕我直言,方法是成員太... – 2009-12-15 08:52:42

+0

如果你不想在同一個地方的方法和成員,不要使用對象 – 2009-12-15 09:38:23

回答

1

也許策略模式是您正在尋找的人。這會給你提供oppurtunity來改變在運行時處理數據的方法。

wiki: strategy pattern

7

我不確定這是一種模式,我只是使用一個接口。

class DataProcessorCore { 
    public virtual void doProcessing() = 0; 

    // Any other virtual methods, but no implementation 
}; 

class DataProcessor : public DataProcessorCore { 
    // implement the methods 
}; 

現在任何只需要DataProcessor功能的應該接口類而不是具體類。如果我正確地理解了你,那麼這將實現方法與方法分離。

+3

「接口」 * *是一個模式;-) – 2009-12-15 08:38:14

+0

我想這是它是否是一個模式,成語或語言功能(例如訪客在C++與雙在CLOS派遣)舊的說法。但我明白你的觀點! – 2009-12-15 08:39:05

0

僅提供getters()的接口?

1

起初我還以爲這是C#問題和擴展方法進入了我的腦海裏,但是當我看到這是C++我tryed找到類比,據我所知,這個比喻是

參數從屬名稱(柯尼希) 查找

參考:

Extension Methods - A Polished C++ Feature

0

我不知道我確切地理解你想要什麼,但也許裝飾者模式是一個看看。

修飾模式附着 附加功能的一個對象 動態。裝飾者提供了一個 靈活的替代方案來支持子類 以擴展功能。

Wiki : Decorator Pattern

0

我認爲,我們可以通過組合傳承和抽象圖案

interface Operations { 
    public void printValue(); 
} 

public class Data { 

    private String value; 

    protected void loadValues() { 
    this.value = "somevalue"; 
    } 

    protected String getValue() { 
    return this.value; 
    } 
} 

public class DataProvider extends Data implements Operations { 
    public Operate() { 
    super.load(); 
    } 

    public void printValue() { 
    System.out.println("Value is "+getValue()); 
    } 
} 

public class Consumer { 
    public static void main() { 
    Operations operate = (Operations) new DataProvider(); 
    operate.printValue(); 
    } 
} 
0

作爲霍爾格說,將適合的是策略的模式,分離從數據處理的數據的邏輯實現這一 - 結構本身。對他們嘗試做的事情有更多的瞭解會很有用,模式會出現,但不會被應用。

1

首先,我沒有看到爲什麼你想讓其他函數看到一個數據而沒有方法的對象。傳遞通常類型的對象時會遇到什麼問題?

二,什麼應該是功能看?一個包含所有公共成員變量的對象?或者只有一個帶有私有成員變量,並且更少 accessor/mutator方法比DataProcessorCore更少?

C++中一個比較常見的習慣用法是把儘可能多的方法放在以外的這個對象。

所以,你的解決方案可能是這樣的:

class DataProcessor { 
    // Fill in only the basics. Member variables and a small set of "core" functions to access/modify them. 
}; 

void ComplexOperation(DataProcessor& proc) { ...} 
float AnotherOperation(DataProcessor& proc, int i) { ...} 

然後消除DataProcessorCore完全。你不需要它,因爲你有包含數據的對象(以及我假設的一小組核心函數),所有更廣泛的功能都可以作爲自由函數來實現,而不是在一個被取消的類中。

標準庫廣泛地使用這種技術。想想std::sort這不是個別容器類中的一員,而是一個免費的功能,可以在的容器被稱爲

相關問題