java 디자인 모드 4 - 장식자 모드
원본 파일을 바꾸거나 계승을 사용할 필요가 없는 상황에서 대상의 기능을 동적으로 확장합니다.그것은 포장 대상, 즉 장식을 통해 진실을 감싸는 대상을 만든다.
한 마디를 중점적으로 이해한다: 동적으로 대상을 확장하는 기능.
내가 이해하는 장식자 모드: 한 물건을 다른 물건으로 포장하여 이 물건 자체의 기능을 증가시킨다.
장식자와 계승의 차이점.
Decorator 모드와 계승 관계의 목적은 모두 대상의 기능을 확장하는 것이지만 Decorator는 계승보다 더 많은 유연성을 제공할 수 있다.
장식자 모드 디자인 원칙(이해):
1. 조합을 많이 사용하고 계승을 적게 한다.
계승 디자인의 하위 클래스를 이용하는 행위는 번역할 때 정태적으로 결정되고 모든 하위 클래스가 같은 행위를 계승한다.그러나 조합된 방법으로 대상을 확장하는 행위가 있으면 동적으로 확장할 수 있다.
앞에서 언급한 전략 모델에서도 언급한 바와 같이 다용도 조합.그럼 전략 모드 장식자는 뭐가 달라요?
1. 장식 대상은 진실한 대상의 인용을 포함하고 전략 모델에 있는 것은 같은 행위 인터페이스의 인용이다.전입할 때는 전입 인터페이스의 실현 유형이다.
2. 클래스 디자인은 확장에 개방하고 수정에 닫아야 한다.
어떤 상황에서 장식자 모드를 사용해야 하는지.
하나의 종류의 기능을 추가하려고 할 때, 이 종류의 코드를 바꿀 수 없다.
javaIO 전형적인 장식자 모델 이해.
수퍼 클래스 입력 스트림: InputStream
두 브랜치:
하나는 바디의 브랜치입니다.FileInputStrean,StringBufferInputString,ByteArrayInputStrean.
2, 장식자 중간층, FilterInpuStrean
BufferInputStrean DataInputStream LineNumberInputStrean
이제 우리는 모든 소문자가 자동으로 대문자로 바뀌는 액세서리 모드를 확장해야 한다. UpperCase Input Stream.
package com.java.jikexueyuan.myiodecorator;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
// .
//
public class UpperCaseInputStream extends FilterInputStream{
//
protected UpperCaseInputStream(InputStream in) {
// super ,FilterInputStream
super(in);
}
//
public int read() throws IOException
{
int c=super.read();
return c==-1?c:Character.toUpperCase((char)(c));
}
public int read(byte[] b,int offset,int len) throws IOException
{
int result=super.read(b,offset,len);
for(int i=0;i<result;i++)
{
b[i]=(byte)Character.toUpperCase((char)(b[i]));
}
return result;
}
}
한 가지 기억해라, 모든 지점에는 중간이 있어야 한다.장식자 클래스에 사용되는 인용
장식자 모드는 어떻게 디자인해요?
1. 추상적인 초류가 있는데 그 안에 추상적인 방법과 공통된 속성 필드 정보가 있다.
2. 그 다음은 주체 부분이다. 주체 부분은 추상적인 초류의 자류로 이해할 수 있다.주체류는 중간층이 있을 수 있다.
//
public abstract class Animal {
//
public String language;
//get/set
//
public abstract String Speak();
}
// ( )
public class Human extends Animal {
@Override
public String Speak() {
return super.language;
}
}
// , . . .
public class Chinese extends Human {
public Chinese(){
super.language=" ";
}
// Human Speak .
}
다음은 진정한 장식자의 부분이다.1. 마찬가지로 중간층이 있어야 한다. (중점) 주로 이 중간층의 디자인이다.
2, 직접 분기 - 직접 방법을 바꾸거나 방법을 추가합니다.
3. 중간층이라는 클래스 안에 초류의 인용이 있는데 구조 방법을 통해 전입(중점).
중간층류는 초류를 직접 계승하는데 그 안에 초류의 인용이 구조 방법에서 전입된다.
그리고 나만의 방법들.
장식할 클래스는 이 중간자류를 직접 계승한다.
// .
public class Gongfu extends Animal{
Animal animal;
Gongfu(Animal animal) {
this.animal=animal;
}
public void gongfu(){
System.out.println(" ");
}
@Override
public String Speak() {
return animal.Speak();
}
}
//
public class Taiji extends Gongfu {
// , Gongfu
Taiji(Animal animal) {
super(animal);
}
public void taiji(){
System.out.println(" taiji");
}
}
이 코드는 약간의 문제가 있어서 생각할 시간이 없다.하지만 장식자의 대체적인 사상은 이렇다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.