java 디자인 모델의 장식 모델 상세 소개

4585 단어 java장식 모드
1. 장식 모드(Decorator)의 정의: 포장(Wrapper) 모드라고도 하는데, 장식 모드는 클라이언트에 대한 투명한 방식으로 대상을 확장하는 기능으로 계승 관계의 대체 방안이다.
2. 장식 모드는 클라이언트의 투명한 방식으로 하나의 대상에 더 많은 책임을 부가한다.다시 말하면 클라이언트는 대상이 장식 전과 장식 후의 차이가 있다고 생각하지 않는다.
3. 장식 모드는 더 많은 하위 클래스를 만들지 않는 모드에서 대상의 기능을 확장할 수 있다.
4. 장식 모드와 클래스 계승의 차이점:
1) 장식 모델은 일종의 동적 행위로 이미 존재하는 클래스를 임의로 조합하고 클래스의 계승은 일종의 정적 행위로 하나의 클래스가 어떤 것으로 정의되고 이 클래스의 대상이 어떤 기능을 가지는지 동적으로 바꿀 수 없다.
2) 장식 모드는 대상의 기능을 확장하고 클래스의 수량을 늘릴 필요가 없다. 클래스 계승 확장은 클래스의 기능이다. 계승의 관계에서 만약에 우리가 대상의 기능을 추가하려면 계승 관계를 통해 하위 클래스에 두 가지 방법을 추가할 수 밖에 없다.
3) 장식과 계승 비교도:
4) 장식 모드는 원류 파일과 사용 계승을 바꾸지 않고 하나의 대상을 동적으로 확장하는 기능으로 포장 대상, 즉 장식을 통해 진짜 대상을 감싸는 것이다.
5. 장식 모드는 클라이언트에 대한 호출을 장식된 클래스에 위임한다. 장식 모드의 관건은 이런 확장이 완전히 투명하다는 데 있다.
6. 장식 모드의 구성:
1) 추상적 구축 역할(Component): 추가 책임을 받아들일 수 있는 대상을 규범화하는 추상적인 인터페이스를 제공한다.i/o 흐름 안의 InputStream/OutputStream 및 Reader/Writer와 같습니다.
2) 구체적인 구축 역할(ConcreteComponent): 추가 책임을 받아들일 클래스를 정의합니다.i/o의 File Output Stream 및 File Input Stream에 해당합니다.
3) 캐릭터 꾸미기(Docorator): 추상적인 구성(Component) 역할에 대한 참조를 가지고 추상적인 위젯과 일치하는 인터페이스를 정의합니다.i/o의 FilerOutputStream 및 FilterInputStream에 해당합니다.
4) 구체적인 장식 역할(ConcreteDecorator): 구축 대상에'붙이기'를 부가하는 책임을 진다.i/o 흐름 안의 Buffered Output Stream과 Buffered Input Stream 및 Data Output Stream과 Data Input Srtream에 해당한다.
7. 장식 모드의 특징:
1) 장식 대상과 실제 대상은 같은 인터페이스를 가지고 클라이언트 대상은 실제 대상과 같은 방식으로 장식 대상과 상호작용을 할 수 있다.
2) 장식 대상은 실제 대상의 인용(reference)을 포함한다.
3) 장식 대상은 클라이언트로부터 모든 요청을 받아들여 실제 대상에게 전달합니다.
4) 장식 대상은 이러한 요청을 전달하기 전이나 이후에 추가 기능을 추가할 수 있다.이렇게 하면 운행할 때 주어진 대상 구조를 수정하지 않고 외부에 추가 기능을 추가할 수 있음을 확보할 수 있다.대상을 대상으로 하는 프로그램 설계에서는 일반적으로 계승된 관계를 사용하여 주어진 종류의 기능을 확장한다.
8. 사례:
1) 추상적인 구축 인터페이스:

packagecom.abao.decorate;

 

public interface Component

{

   public void doSomething();

}

2) 구체적인 구축 역할:

packagecom.abao.decorate;

public class ConcreteComponent implements Component

{

   @Override

   public void doSomething()

   {

      System.out.println(" A");

   }

}

3) 장식 캐릭터:

packagecom.abao.decorate;

 

public class Decorate implements Component

{

   private Component component;

   public Decorate(Component component)

   {

      this.component = component;

   }

 

   @Override

   public void doSomething()

   {

      component.doSomething();

   }

}

4) 캐릭터 1:

packagecom.abao.decorate;

 

public class ConcreteDecorate1 extends Decorate

{

   public ConcreteDecorate1(Component component)

   {

      super(component);

   }

   @Override

   public void doSomething()

   {

      super.doSomething();

    

      this.doAnotherDosomething();

   }

   private void doAnotherDosomething()

   {

      System.out.println(" B");

   }

}

5) 캐릭터 꾸미기2:

packagecom.abao.decorate;

 

public class ConcreteDecorate2 extends Decorate

{

   public ConcreteDecorate2(Component component)

   {

      super(component);

   }

   @Override

   public void doSomething()

   {

      super.doSomething();

    

      this.doAnotherDosomething();

    

   }

   private void doAnotherDosomething()

   {

      System.out.println(" C");

   }

}

6) 클라이언트

packagecom.abao.decorate;

 

public class Client

{

   public static void main(String[] args)

   {

 

      Component component = new ConcreteDecorate1(

        new ConcreteDecorate2(new ConcreteComponent()));

      component.doSomething();

   }

}

9.끝!

좋은 웹페이지 즐겨찾기