2009-05-06 2 views
0

데코레이터 패턴에 대한 이전의 이해는 WindowWindowDecorator으로 상속 한 다음 오버라이드 된 메서드에서 해당 메서드의 Window을 호출하기 전에 몇 가지 추가 작업을 수행해야한다는 것입니다. 다음과 유사한 :상속 대신 컴포지션을 사용하는 데코레이터 패턴

public class Window 
{ 
    public virtual void Open() 
    { 
     // Open the window 
    } 
} 

public class LockableWindow : Window // Decorator 
{ 
    public virtual void Open() 
    { 
     // Unlock the window 
     base.Open(); 
    } 
} 

그러나이 본질적으로 장식을 하드 코드, 그래서 방법이 대신 상속의 구성을 사용하는 리팩토링 할 것인가?

답변

7

죄송합니다. C#은 약간 녹슬지 않으므로 문법 오류가있을 수 있지만 기본 아이디어는 옳습니다.

public interface IWindow 
{ 
    void Open(); 
} 

public class Window : IWindow 
{ 
    public virtual void Open() 
    { 
     // Open the window 
    } 
} 

public class LockableWindow : IWindow 
{ 
    private IWindow _wrappedWindow; 

    public LockableWindow(IWindow wrappedWindow) 
    { 
     _wrappedWindow = wrappedWindow; 
    } 

    public virtual void Open() 
    { 
     // TODO Unlock window if necessary 
     _wrappedWindow.open(); 
    } 
} 

알아둬야 할 중요한 사항은 새로운 IWindow 인터페이스입니다. 그것이 다형성을 계속 사용할 수있게 해줍니다.

+0

녹슬지는 않지만 가상 인터페이스 메서드를 구현하는 데 필요하지 않지만 –

+0

감사합니다. 나는 닷넷 1.0 이후로 아무 것도 쓰지 않았다. 이 질문에 새로운 언어 기능이 필요 없다는 것입니다. –

1

Decorator 패턴의 요점은 발신자에게 투명성있는 방식으로 일부 기능 (예 : 스트림에 버퍼링 추가)으로 개체를 향상시키는 것입니다. 가장 효과적으로 사용하려면 리팩터링 코드없이 데코 레이팅 된 구현을 바꿀 수 있어야합니다. 기본적으로 상속 계층 구조를 유지해야한다는 의미입니다.

실제 관심사는 무엇입니까? 예 : '이 단단한 장식'은 실제로 무엇을 의미합니까? 어떤 종류의 문제를 풀고 싶습니까? 장식이 올바른 접근법이 아닐 수도 있습니다 ...

0

단순히 LockableWindow에 장식 할 Window 인스턴스 유형을 사용하는 생성자를 정의하십시오. 당신은 또한 속성을 통해 그것을 할 수 있습니다.

public class Window 
{  
    public virtual void Open()  
    {   
    // Open the window  
    } 
} 

public class LockableWindow // Decorator 
{  
    private Window window; 

    public LockableWindow(Window w) 
    { 
    window = w; 
    }  

    public virtual void Open()  
    {   
    // Unlock the window   
    window.Open();  
    } 
} 
+0

하나의 문제는 LockableWindow가 Window에 다형성이 없다는 것입니다. 편집 : 방공호에서 이것이 사실 인 것으로 나타났습니다. –

0

데코레이터 패턴에 대한 이해는 객체의 기능을 런타임에 향상시킬 수 있도록하기위한 것입니다. 위키 백과 설명에서, 그들은이 목적을위한 구성 요소 스택에 중점을 둡니다.

나는 C#을 전혀 말하지 않으므로 이것은 (분명히) php-ish입니다.

클래스 이미지가 {

function open(){ ... } 

이} // 클래스의 끝이

클래스 decoratedImage 이미지 {

private goodies=array(); //the alleged 'component stack' 

function addGoodie($item){ 
     $this->goodies[]=$item; 
} 

function open()}{ 

     parent::open(); 
     foreach ($this->goodies as $componentClassName){ 

      $component=new $componentClassName(); 
      $component->apply($this); 

     } 

} 

} // 끝을 확장 : 올바른 생각이 될 것으로 보인다 등급

오랜 경험을 가진 분들, 연결 해제에 대해 설명해주십시오.

관련 문제