디자인 모델 총화 의 장식 모델 (Decorator)

더 읽 기
장식 모드 (Decorator) 는 장 식 된 하위 클래스 의 인 스 턴 스 를 사용 하여 클 라 이언 트 에서 이 하위 클래스 의 인 스 턴 스 를 장식 류 에 위탁 하 는 것 입 니 다.장식 모드 는 관 계 를 맺 는 대체 방안 이다.
장식 모델 은 클 라 이언 트 에 대한 투명 한 방식 으로 대상 의 기능 을 추 가 했 고 동태 적 으로 대상 에 게 책임 을 추 가 했 습 니 다. 물론 이곳 의 계승 은 정적 입 니 다.
그 중에서 중요 한 지역 에서 장식 대상 과 실제 대상 은 똑 같은 인 터 페 이 스 를 가진다. 그러면 클 라 이언 트 는 실제 대상 과 똑 같은 상호작용 방식 과 장식 대상 과 상호작용 을 할 수 있다. 그리고 장식 대상 은 클 라 이언 트 에서 받 은 모든 요 구 를 실제 대상 에 게 전달 한 다음 에 클 라 이언 트 에 게 반환 할 수 있다.이렇게 장식 대상 은 리 트 윗 전이 나 그 후에 추가 기능 을 추가 하여 실제 대상 에 대한 조작 에 영향 을 주지 않 을 수 있다. 이렇게 하면 원래 의 유형 을 바 꾸 지 않 는 토대 에서 원래 의 이러한 추가 기능 에 대한 실현 을 실현 하고 프로그램의 재 활용 성 을 강화 할 수 있다.
또한 장식 모델 이 계승 보다 좋 은 점 은 장식 모델 이 이미 존재 하 는 유형 을 동태 적 으로 조합 하여 원 하 는 기능 을 실현 할 수 있 고 계승 은 정태 적 인 실현 이 므 로 원래 의 실현 을 바 꿀 수 없다 는 것 이다. 만약 에 더 많은 기능 을 추가 하려 면 더 많은 파생 류 를 추가 해서 실현 해 야 한다.
다음은 직원 가공 화 를 예 로 들 어 장식 자 모델 을 실현 한다.
추상 구성 요소 Work. java
 
package decorator;
 
public abstract class Work {
     public abstract void painting();
}

 
   장식 자 1Work. java
package decorator;

public class WorkerOne extends Work {
	@Override
	public void painting() {
          System.out.println("1     ");
	}

}
 장식 자 3Work. java
package decorator;

public class WorkerThree extends Work {
	//    
	private Work work;
	 
	public WorkerThree(Work work) {
	    this.work = work;
	}
	 
	private WorkerThree() {}
	
	@Override
	public void painting() {
          System.out.println("3             。");
          //        
          work.painting();
          //       
          System.out.println("3      。");
	}

}
 장식 자 2Work. java
package decorator;

public class WorkerTwo extends Work {
	//    
	private Work work;
	 
	public WorkerTwo(Work work) {
	    this.work = work;
	}
	 
	private WorkerTwo() {}
	
	@Override
	public void painting() {
          System.out.println("2              。");
          //        
          work.painting();
          //       
          System.out.println("2          。");
	}

}
 테스트 클래스
package decorator;

public class Test {

	public static void main(String[] args) {
		
		System.out.println("*****      *****");
		WorkerOne workerOne = new WorkerOne();
        workerOne.painting();
        
        System.out.println("*****      *****");
        WorkerTwo workerTwo = new WorkerTwo(workerOne);
        workerTwo.painting();
        
        System.out.println("****     *****");
        WorkerThree workerThree = new WorkerThree(workerTwo);
        workerThree.painting();
	}

}
 장식 자 모드 적용 장소:
1.             ,               ,          。
2.                           ,           ,            ,                  ,    。

장식 모델 모델 은 대리 모델 의 특수 한 응용 이 라 고 할 수 있 고 심지어 그들의 구조 적 으로 일치 하 다 고 볼 수 있다.다만 이들 의 관심 사 는 지역 이 다 르 고 대리 모델 은 대상 방법의 예비 처리 와 사후 처리, 장식 모델 은 대상 방법의 '강화' (주의: '증가' 가 아니 라) 또는 '약화' 에 관심 을 가진다.
책임 체인 모델 은 여러 개의 처리 대상 을 하나의 체인 모양 으로 모 으 고 처리 대상 은 체인 헤드 에 직접 맡 기 며 처리 가 완료 되 거나 마지막 처리 대상 에 도착 할 때 까지 체인 에서 순서대로 전달 된다.책임 체인 모드 는 요청 과 처 리 를 분리 할 수 있 지만 체인 이 너무 긴 시간 동안 의 성능 문제 와 체인 중의 노드 수량 문 제 를 주의해 야 한다.
전략 모델 은 대상 의 방법 행 위 를 동적 으로 바 꾸 는 경 로 를 제공 합 니 다.이 는 알고리즘 을 패키지 하고 대상 에서 Setter (또는 구조 함수) 를 사용 하여 구체 적 인 알고리즘 대상 을 받 은 다음 대상 방법 이 호출 될 때 받 은 구체 적 인 알고리즘 을 실행 하 는 것 을 실현 합 니 다.
javaIO 는 전형 적 인 장식 자의 예 입 니 다. 우 리 는 직접 사용 할 수 있 습 니 다.
 
입력 스 트림 문 자 를 소문 자 LowerCase InputStream. 자바 로 변경 합 니 다.
 
package javaIO;

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

public class LowerCaseInputStream extends FilterInputStream {

	protected LowerCaseInputStream(InputStream in) {
		super(in);
	}

	public int read() throws IOException{
		int i = super.read();
		return i==-1?i:Character.toLowerCase(i);
	}
	
	public int read(byte[] b,int off,int len) throws IOException{
		int result = super.read(b, off, len);
		for(int i=off;i      
  
package javaIO;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Test {

	public static void main(String[] args) throws IOException {

		int c;
		try {
			InputStream in = new LowerCaseInputStream(
					new BufferedInputStream(
							new FileInputStream("test.txt")));
			
			while((c=in.read())>=0){
				System.out.print((char)c);
			}
			
//			byte[] b=new byte[3];
//			while((c=in.read(b,0,3))>=0){
//				for(int i=0;i<3;i++){
//					System.out.print((char)b[i]);
//				}
//			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

}
 

좋은 웹페이지 즐겨찾기