java 디자인 모드의 구조적 모드 - 장식 모드 ((Decorator))

3032 단어 Decorator
1. 장식 모드의 정의: 장식 모드는 원류 파일을 바꾸거나 계승을 사용할 필요가 없는 상황에서 동적으로 대상을 확장하는 기능이다.그것은 포장 대상, 즉 장식을 통해 진실을 감싸는 대상을 만든다.2. 장식 모델의 특징.(1) 장식 대상과 실제 대상은 같은 인터페이스를 가진다.이렇게 하면 클라이언트 대상은 실제 대상과 같은 방식으로 장식 대상과 상호작용할 수 있다.(2) 장식 대상은 실제 대상의 인덱스(reference)를 포함한다. (3) 장식 대상은 클라이언트로부터 모든 요청을 받는다.그것은 이 요청들을 실제 대상에게 전달한다.(4) 장식 대상은 이러한 요청을 전달하기 전이나 이후에 추가 기능을 추가할 수 있다.이렇게 하면 운행 시 주어진 대상의 구조를 수정하지 않아도 외부에 추가 기능을 추가할 수 있다.대상을 대상으로 하는 디자인에서 일반적으로 계승을 통해 주어진 클래스에 대한 기능 확장을 실현한다.3. 장식 모드 VS 계승
장식 모드
특정 객체를 확장하는 기능
하위 클래스 필요 없음
동적
런타임 지정 책임
하위 클래스로 인한 복잡함과 혼란을 방지하다
유연성 향상
주어진 대상에 대해 서로 다른 장식 대상이 있을 수 있으므로 클라이언트는 필요에 따라 적당한 장식 대상을 선택하여 메시지를 보낼 수 있다.
물려받다
클래스 대상을 확장하는 기능
필요 하위 클래스
정적
편역 시 직책을 분배하다
많은 자류가 생겨나고, 일부 장소에서는 누락된 계층을 보고한다.
유연성 부족
모든 가능한 연합에 대해 고객의 기대는 어떠한 어려움도 증가시키기 쉽다
4. 실례: 사람이 밥을 먹는다.참가자: 1.Component: 대상 인터페이스를 정의하여 이 대상에게 동태적으로 직책(식사)을 추가할 수 있습니다.
public interface Person {

    void eat();
}

2. Concrete Component: 대상을 정의하고 이 대상에게 직책을 추가할 수 있다.
public class Man implements Person {

	public void eat() {
		System.out.println("     ");
	}

3. Decorator: Component 대상을 가리키는 바늘을 유지하고 Component 인터페이스와 일치하는 인터페이스를 정의합니다.
public abstract class Decorator implements Person {

    protected Person person;
    
    public void setPerson(Person person) {
        this.person = person;
    }
    
    public void eat() {
        person.eat();
    }
}

4. ConcreteDecorator에서 어셈블리에 책임을 추가합니다(reEat).
public class ManDecoratorA extends Decorator {

    public void eat() {
        super.eat();
        reEat();
        System.out.println("ManDecoratorA ");
    }

    public void reEat() {
        System.out.println("     ");
    
}

public class ManDecoratorB extends Decorator {
    
    public void eat() {
        super.eat();
        System.out.println("===============");
        System.out.println("ManDecoratorB ");
    }
}

테스트 클래스:
public class Test {

    public static void main(String[] args) {
        Man man = new Man();
        ManDecoratorA md1 = new ManDecoratorA();
        ManDecoratorB md2 = new ManDecoratorB();
        
        md1.setPerson(man);
        md2.setPerson(md1);
        md2.eat();
    }
}

result 테스트 결과:

    
     
ManDecoratorA 
===============
ManDecoratorB 

참조 자료:
http://www.blogjava.net/chenweicai/archive/2007/03/23/105860.html

좋은 웹페이지 즐겨찾기