2012-12-24 4 views
0

개체에 추가 데이터를 추가해야하지만 기능을 추가 할 필요가 없습니다. 그러므로 고전적인 GOF Decorator Pattern의 예는 다음과 같습니다.이것이 데코레이터 패턴의 예입니까 (객체에 데이터 추가)?

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 있다고 말할 것입니다. 이 유효한 C의 # 구문이 아닌 경우 죄송합니다 :

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 :

데코레이터는 다음과 같이 될 것이다. 저는 자바 개발자입니다.

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; 
    } 
} 

는 (I 자바 구문을 사용 당신이 그것을 둘 수 C# 또는 자바를 사용하는 구문에 따르면 있는지 없었기 때문에.)

관련 문제