java 디자인 모드 4 - 장식자 모드

8253 단어
무엇이 장식자 모드입니까?
원본 파일을 바꾸거나 계승을 사용할 필요가 없는 상황에서 대상의 기능을 동적으로 확장합니다.그것은 포장 대상, 즉 장식을 통해 진실을 감싸는 대상을 만든다.
한 마디를 중점적으로 이해한다: 동적으로 대상을 확장하는 기능.
내가 이해하는 장식자 모드: 한 물건을 다른 물건으로 포장하여 이 물건 자체의 기능을 증가시킨다.
장식자와 계승의 차이점.
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");
    }
}
이 코드는 약간의 문제가 있어서 생각할 시간이 없다.하지만 장식자의 대체적인 사상은 이렇다.

좋은 웹페이지 즐겨찾기