디자인 모델 학습 - 장식 자 모델 (Decorator Pattern)

7363 단어 디자인 모드
디자인 모델 학습 - 장식 자 모델 (Decorator Pattern)
2013 년 5 월 19 일 날씨: 흐 리 고 비
쉬 지 않 고 디자인 모델 을 계속 공부 하 다.
작은 무당 이 소 리 쳤 다. 아, 아, 아, 아.
장식 자 모드 가 뭐 예요?
사실 우 리 는 자바 I / O 를 사용 할 때 이미 사용 한 적 이 있 습 니 다. 다만 이것 이 바로 디자인 모델 이라는 것 을 모 를 수도 있 습 니 다. 뒤에 자신의 장식 자 모델 을 디자인 하고 다시 소개 하 겠 습 니 다.
HeadFirst 는 이렇게 정의 합 니 다. 동적 으로 책임 을 대상 에 추가 합 니 다. 기능 을 확장 하려 면 장식 자 는 계승 보다 탄력 있 는 대체 방안 을 제공 합 니 다.
새로운 설계 원칙
확장 개발
요점 을 적어 주세요.
1. 계승 은 확장 형식 중 하나 이지 만 탄력 적 인 디자인 에 이 르 는 가장 좋 은 방법 은 아니다.
2. 우리 의 디자인 에서 행 위 를 확장 할 수 있 도록 허용 해 야 하 며 기 존의 코드 를 수정 할 필요 가 없습니다.
3. 조합 과 의뢰 는 실행 시 동적 으로 새로운 행동 을 추가 하 는 데 사용 할 수 있 습 니 다.
4. 계승 을 제외 하고 장식 자 모드 도 우리 로 하여 금 행 위 를 확장 하 게 할 수 있다.
5. 장식 자 모델 은 한 무리의 장식 자 류 를 의미 하 는데 이런 유형 은 구체 적 인 구성 요 소 를 포장 하 는 데 사용 된다.
6. 장식 자 류 는 장식 되 어 있 는 구성 요소 의 유형 을 나타 낸다 (사실은 그들 은 똑 같은 유형 을 가지 고 인터페이스 나 계승 을 통 해 이 루어 진다)
7. 장식 자 는 피 장식 자의 행위 와 / 또는 그 뒤에 자신의 행 위 를 더 하고 심지어 피 장식 자의 행 위 를 전체적으로 대체 하여 특정한 목적 을 달성 할 수 있다.
8. 수많은 장식 자 들 로 구성 요 소 를 포장 할 수 있 습 니 다.
9. 장식 자 는 일반적으로 구성 요소 의 고객 에 게 투명 합 니 다. 클 라 이언 트 프로그램 이 구성 요소 의 구체 적 인 유형 에 의존 하지 않 는 한.
10. 장식 자 는 디자인 에 작은 대상 이 많이 나타 나 고 지나치게 사용 하면 프로그램 을 복잡 하 게 만 들 수 있다.
장식 자 모드 예: 별 바 즈 커피
어떻게 시작 해요?
별 바 즈 코드 쓰기:
package decoratorPattern;
/**
 * 2013/5/19
 * @author wwj
 *      
 */
public abstract class Beverage {
	String description = "Unknown Beverage"; //    
	
	public String getDescription() {	//      
		return description;
	}
	
	public abstract double cost();	//    ,        
}
package decoratorPattern;

/**
 * 2013/5/19
 * @author wwj
 *      :     
 */
public abstract class CondimentDecorator extends Beverage {

	@Override
	public double cost() {
		return 0;
	}
	
	/**
	 *                getDescription()  。
	 */
	public abstract String getDescription();

}

음료수 코드 쓰기:
여기 네 가지 가 있 습 니 다. Epresso, HouseBlend, DarkRoast, Decat
package decoratorPattern;

/**
 * 2013/5/19
 * @author wwj
 *     ,    
 */
public class Espresso extends Beverage {
	public Espresso() {
		description = "Espresso";
	}
	
	@Override
	public double cost() {
		return 1.99;
	}

}
package decoratorPattern;

/**
 * 2013/5/19
 * @author wwj
 *     
 */
public class HouseBlend extends Beverage {
	public HouseBlend(){
		description = "House Blend Coffee";
	}
	
	@Override
	public double cost() {
		return .89;
	}

}
package decoratorPattern;

/**
 * 2013/5/19
 * @author wwj
 *     
 */
public class DarkRoast extends Beverage {
	public DarkRoast(){
		description = "DarkRoast";
	}
	@Override
	public double cost() {
		return .99;
	}

}
package decoratorPattern;

/**
 * 2013/5/19
 * @author wwj
 *     
 */
public class Decat extends Beverage {
	public Decat(){
		description = "Decat";
	}
	@Override
	public double cost() {
		return 1.05;
	}

}

소스 코드 쓰기
여기에 세 가지 양념 이 있다. 모 차, 소이, 휘 프.
package decoratorPattern;

/**
 * 2013/5/19
 * @author wwj
 *      :  
 */
public class Mocha extends CondimentDecorator {
	//            ,       
	Beverage beverage;
	
	/**
	 *                 
	 * @param beverage
	 */
	public Mocha(Beverage beverage) {
		this.beverage = beverage;
	}

	
	/**
	 *          ,      ,            
	 */
	@Override
	public String getDescription() {
		return beverage.getDescription() + ", Mocha";
	}
	
	/**
	 *    Mocha     。             ,     ,     Mocha   ,      
	 */
	public double cost() {
		return .20 + beverage.cost();
	}
}
package decoratorPattern;

/**
 * 2013/5/19
 * @author wwj
 *   ,    
 */
public class Soy extends CondimentDecorator {
	Beverage beverage;
	
	
	public Soy(Beverage beverage) {
		this.beverage = beverage;
	}


	@Override
	public String getDescription() {
		return beverage.getDescription() + ",Soy";
	}
	
	public double cost() {
		return .15 + beverage.cost();
	}

}
package decoratorPattern;

/**
 * 2013/5/19
 * @author wwj
 *   ,    
 */
public class Whip extends CondimentDecorator {
	Beverage beverage;
	
	
	public Whip(Beverage beverage) {
		this.beverage = beverage;
	}


	@Override
	public String getDescription() {
		return beverage.getDescription() + ",Whip";
	}
	
	public double cost() {
		return .10 + beverage.cost();
	}

}

이제 커피 를 공급 할 수 있 습 니 다.
실험 결 과 는 다음 과 같다.
package decoratorPattern;

/**
 *    ,    
 * @author wwj
 *
 */
public class StarbuzzCoffee {

	public static void main(String[] args) {
		//   Espresso,     ,          
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + " $" + beverage.cost());
		
		Beverage beverage2 = new DarkRoast();
		beverage2 = new Mocha(beverage2);	// Mocha   
		beverage2 = new Mocha(beverage2);	//    Mocha   
		beverage2 = new Whip(beverage2);	// Whip   
		System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
		
		
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Soy(beverage3);
		beverage3 = new Mocha(beverage3);
		beverage3 = new Whip(beverage3);
		System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
	}
}

시원 하 게 보지 못 했다 면 헤드 퍼스트 디자인 모델 을 구입 하 세 요. 소 무 는 초보 라 도 이 책 이 팔 만 한 가치 가 있 고 그림 과 글 이 모두 훌륭 해서 피곤 하지 않 을 것 같 습 니 다.
처음에 자바 에서 인 테 리 어 모드 를 사용 하 는 I / O 라 고 말씀 드 렸 잖 아 요.
대문자 문 자 를 소문 자로 변환 하 는 동작 을 확장 합 니 다.
Espresso $1.99
DarkRoast, Mocha, Mocha,Whip $1.49
House Blend Coffee,Soy, Mocha,Whip $1.34
package javaIo;

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

/*
 *      Java I/O   
 */
public class LowerCaseInputStream extends FilterInputStream {

	protected LowerCaseInputStream(InputStream in) {
		super(in);
	}
	/**
	 *     
	 */
	public int read() throws IOException {
		int c = super.read();
		return (c == -1 ? c : Character.toLowerCase((char) c));
	}
	
	/**
	 *       
	 */
	public int read(byte[] b, int offset, int len) throws IOException {
		int result = super.read(b, offset, len);
		for(int i = offset; i < offset + result; i++) {
			b[i] = (byte) Character.toLowerCase((char)b[i]);
		}
		return result;
	}

}

테스트 결과:
package javaIo;

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

public class InputTest {
	public static void main(String[] args) throws IOException{
		int c;
		try {
			//  FileInputStream,  BufferedInputStream   ,       
			//LowerCaseInputStream      
			InputStream in =
				new LowerCaseInputStream(
						new BufferedInputStream(new FileInputStream("D:/test.txt")));
			while((c = in.read()) >= 0) {
				System.out.print((char)c);
			}
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

ok, 장식 자 모드 가 이 렇 습 니 다. 장식 자 와 피 장식 자 간 의 관 계 를 파악 하 는 것 도 이해 하기 어 려 울 것 이 없습니다. 다음 디자인 모델: 공장 모드, 자주 사용 하 는 모델 입 니 다. 오늘 은 일요일 입 니 다. 소중 한 주말 시간 이 없어 질 것 입 니 다. 이틀 동안 블 로 그 를 자주 발표 할 생각 은 없 겠 지만 시간 이 있 으 면 계속 공부 하 겠 습 니 다.

좋은 웹페이지 즐겨찾기