java 디자인 모델의 장식 모델 상세 소개
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.끝!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.