2012-12-24 79 views
0

我需要將其他數據添加到對象 - 但我不需要添加功能。因此下面是一個典型的GOF裝飾模式的例子?這是Decorator模式的示例(將數據添加到對象)?

class ClassIWantToDecorate 
{ 
    public string GetData() { return "data"; } 
} 

class Decorator 
{ 
    private ClassIWantToDecorate _classIWantToDecInstance = null; 
    private string _additionalData; 
    public Decorator(ClassIWantToDecorate classIWantToDec, string additionalData) 
    { 
     _classIWantToDecInstance = classIWantToDec; 
     _additionalData = additionalData; 
    } 

    public string DataINeed() 
    { 
     return _classIWantToDecInstance.GetData(); 
    } 

    public string AdditionalDataINeed() 
    { 
     return _additionalData; 
    } 
} 

回答

2

不,我會說這只是composition

裝飾器將是這樣的:

interface DataINeedProvider { 
    string DataINeed(); 
} 

class LoggingDecorator implements DataINeedProvider 
{ 
    private DataINeedProvider _classIWantToDecInstance = null; 
    private Logger logger = new Logger(); 
    public LoggingDecorator(DataINeedProvider classIWantToDec) { 
     _classIWantToDecInstance = classIWantToDec; 
    } 

    public string DataINeed() 
    { 
     logger.log("DataINeed has been called"); 
     return _classIWantToDecInstance.DataINeed(); 
    } 
} 

PS:抱歉,如果這不是有效的C#語法。我是一名Java開發人員。

1

你的實現的問題是你的裝飾器接口與裝飾對象的接口不兼容。

有效的裝飾解決方案是:

interface ClassIWantToDecorateInterface { 
    public string GetData(); 
} 

class ClassIWantToDecorate implements ClassIWantToDecorateInterface { 
    public string GetData() { return "data"; } 
} 

class Decorator implements ClassIWantToDecorateInterface { 
    private ClassIWantToDecorateInterface _classIWantToDecInstance = null; 
    private string _additionalData; 
    public Decorator(ClassIWantToDecorateInterface classIWantToDec, string additionalData) 
    { 
     _classIWantToDecInstance = classIWantToDec; 
     _additionalData = additionalData; 
    } 

    public string GetData() { 
     return _classIWantToDecInstance.GetData(); 
    } 

    public string AdditionalDataINeed() { 
     return _additionalData; 
    } 
} 

(我用Java的語法,因爲我不知道你是用C#或Java根據語法也可能是兩者兼而有之。)