디자인 모델 학습 - 장식 자 모델 (Decorator Pattern)
7363 단어 디자인 모드
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, 장식 자 모드 가 이 렇 습 니 다. 장식 자 와 피 장식 자 간 의 관 계 를 파악 하 는 것 도 이해 하기 어 려 울 것 이 없습니다. 다음 디자인 모델: 공장 모드, 자주 사용 하 는 모델 입 니 다. 오늘 은 일요일 입 니 다. 소중 한 주말 시간 이 없어 질 것 입 니 다. 이틀 동안 블 로 그 를 자주 발표 할 생각 은 없 겠 지만 시간 이 있 으 면 계속 공부 하 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.