[Java 성능 최적화 노트] 06 데코레이터 모드

2777 단어
장식자 모델은 매우 교묘한 구조를 가지고 있으며 동적 추가 대상 기능을 할 수 있다.이것은 위탁 메커니즘을 사용하여 코드의 결합성을 낮추고 시스템의 각 구성 요소를 복용하여 우리가 최종적으로 구성한 대상이 이러한 모든 기능을 가지도록 한다.
장식자 모드는 성능 부품과 기능 부품을 효과적으로 분리하여 모듈의 유지보수성을 향상시키고 모듈의 복용성을 증가시킬 수 있다.
장식자(Decorator와 피장식자(ConcreteComponent는 같은 인터페이스Component를 가지고 있다.피장식자는 통상적으로 시스템의 핵심 부품으로 특정한 기능 목표를 완성한다.한편, 장식자는 피장식자의 방법 전후에 특정한 전치 처리나 후치 처리를 추가하여 피장식자의 기능을 강화할 수 있다.
다음은 예를 들어 설명합니다.
필요: 컨텐트를 HTML로 게시해야 합니다.
  • 컨텐트를 HTML 텍스트로 변환해야 함
  • HTML 헤드 증가
  • HTTP 헤드 증가
  • 우선, 우리는 구성 요소 인터페이스를 정의하는데, 그 주요 기능은 내용을 처리하는 것이다.
    public interface IPacketCreator {
        public String handleContent();
    }
    
    PacketCreator 패킷을 반환하는 데 사용되는 핵심 데이터:
    public class PacketBodyCreator implements IPacketCreator {
    
        @Override
        public String handleContent() {
            return "Content of Body";
        }
    }
    
    PacketDecorator 구성 요소를 유지보수하는데 업무 논리를 실현하지 않고 하위 클래스에 의뢰 대상만 제공한다.
    public abstract class PacketDecorator implements IPacketCreator {
        IPacketCreator component;
    
        public PacketDecorator(IPacketCreator creator) {
            this.component = creator;
        }
    }
    

    다음은 구체적인 구성 요소의 실현이다.
    public class PacketHtmlHeaderCreator extends PacketDecorator {
    
        public PacketHtmlHeaderCreator(IPacketCreator creator) {
            super(creator);
        }
    
        @Override
        public String handleContent() {
            StringBuilder sb = new StringBuilder();
            sb.append("");
            sb.append("");
            sb.append(component.handleContent());
            sb.append("");
            sb.append("");
            return sb.toString();
        }
    }
    
    
    public class PacketHTTPHeaderCreator extends PacketDecorator{
    
        public PacketHTTPHeaderCreator(IPacketCreator creator) {
            super(creator);
        }
    
        @Override
        public String handleContent() {
            StringBuffer sb = new StringBuffer();
            sb.append("CacheControl:no-cache
    "); sb.append("Date:Sun,21June201515:58:57GMT
    "); sb.append(component.handleContent()); return sb.toString(); } }

    테스트:
    public class DecoratorTester {
        public static void main(String[] args) {
            IPacketCreator pc = new PacketHTTPHeaderCreator(
                    new PacketHtmlHeaderCreator(new PacketBodyCreator()));
            System.out.println(pc.handleContent());
        }
    }
    

    예에서 알 수 있듯이 구성 요소의 각종 기능은 마지막에 최종 pc에 층층이 박혀 있다.
    사실 장식자 모델은 일상적인 사용에서도 흔히 볼 수 있다. 예를 들어 JDK의 IO Stream:
    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("/data/file.txt")));
    

    2015-06-21

    좋은 웹페이지 즐겨찾기