디자인 모델 2.0 - 소프트웨어 구조 디자인 의 7 대 원칙 인 리 씨 교체 원칙

5298 단어 디자인 모드 2.0
리 씨 교체 원칙 (Liskov Substitution Principle, LSP) 은 각 유형 이 T1 인 대상 o1 이면 T2 인 대상 o2 가 있어 T1 로 정 의 된 모든 프로그램 P 가 모든 대상 o1 에서 o2 로 바 뀌 었 을 때 프로그램 P 의 행동 에 변화 가 없 으 면 유형 T2 는 유형 T1 의 하위 유형 이다.정 의 는 추상 적 으로 보 입 니 다. 우 리 는 다시 한 번 이해 할 수 있 습 니 다. 하나의 소프트웨어 실체 로 이해 할 수 있 습 니 다. 만약 에 하나의 부모 류 를 적용 하면 반드시 그 하위 류 에 적용 되 고 모든 부모 류 를 인용 하 는 곳 은 그 하위 류 의 대상 을 투명 하 게 사용 해 야 합 니 다. 하위 대상 은 부모 류 의 대상 을 대체 할 수 있 고 프로그램의 논 리 는 변 하지 않 습 니 다.이 이해 에 근거 하여 우 리 는 총 결 해 보 자.
인용 의미: 자 류 는 부류 의 기능 을 확장 할 수 있 으 나 부류 의 원래 기능 을 바 꿀 수 없다.1. 자 류 는 부류 의 추상 적 인 방법 을 실현 할 수 있 으 나 부류 의 비 추상 적 인 방법 을 덮어 서 는 안 된다.2. 하위 클래스 에서 자신 만 의 독특한 방법 을 추가 할 수 있 습 니 다.3. 하위 클래스 의 방법 으로 부모 클래스 의 방법 을 다시 불 러 올 때 방법의 사전 조건 (즉, 방법의 입력 / 입 참) 은 부모 클래스 방법의 입력 매개 변수 보다 더 느슨 합 니 다.4. 하위 클래스 의 방법 으로 부모 클래스 의 방법 을 실현 할 때 (재 작성 / 재 업로드 또는 추상 적 인 방법 실현) 방법의 사후 조건 (즉, 방법의 출력 / 반환 값) 은 부모 클래스 보다 더욱 엄격 하거나 같다.
 
앞에서 개폐 원칙 을 말 할 때 복선 을 묻 었 습 니 다. 우 리 는 접 은 후에 부 류 를 덮어 쓰 는 getPrice () 방법 을 다시 쓰 고 소스 코드 를 얻 는 방법 getOrigin Price () 를 추가 한 것 을 기억 합 니 다. 분명히 리 씨 교체 원칙 에 어 긋 납 니 다.코드 를 수정 하 겠 습 니 다. getPrice () 방법 을 덮어 쓰 지 말고 getDiscountPrice () 방법 을 추가 해 야 합 니 다.

public class JavaDiscountCourse extends JavaCourse {
    public JavaDiscountCourse(Integer id, String name, Double price) {
   		 super(id, name, price);
    }
    public Double getDiscountPrice(){
   		 return super.getPrice() * 0.61;
    }
}

  : 1、 , 。 2、 , , 、 。 。 , 、 , , Rectangle :


/**
 * @author madongyu
 * @projectName design-pattern-ma
 * @description: TODO
 * @date 2019/6/1817:28
 */
public class Rectangle {
    private long height;
    private long width;

    public long getHeight() {
        return height;
    }

    public void setHeight(long height) {
        this.height = height;
    }

    public long getWidth() {
        return width;
    }

    public void setWidth(long width) {
        this.width = width;
    }
}

Square :


/**
 * @author madongyu
 * @projectName design-pattern-ma
 * @description: TODO
 * @date 2019/6/1817:28
 */
public class Square  extends Rectangle{
    private long length;

    public long getLength() {
        return length;
    }

    public void setLength(long length) {
        this.length = length;
    }

    @Override
    public long getHeight() {
        return getLength();
    }

    @Override
    public void setHeight(long height) {
        setLength(height);
    }

    @Override
    public long getWidth() {
        return getLength();
    }

    @Override
    public void setWidth(long width) {
        setLength(width);
    }
}

/**
 * @author madongyu
 * @projectName design-pattern-ma
 * @description: TODO
 * @date 2019/6/1817:31
 */
public class Test {
    public static void resize(Rectangle rectangle){
        while (rectangle.getWidth() >= rectangle.getHeight()){
            rectangle.setHeight(rectangle.getHeight() + 1);
            System.out.println("width:"+rectangle.getWidth() + ",height:"+rectangle.getHeight());
        }
        System.out.println("resize     " +
                "
width:"+rectangle.getWidth() + ",height:"+rectangle.getHeight()); } public static void main(String[] args) { Rectangle rectangle = new Rectangle(); rectangle.setWidth(20); rectangle.setHeight(10); resize(rectangle); } }

, 。 , Rectangle Square, :


public static void main(String[] args) {
        Square square = new Square();
        square.setLength(10);
        resize(square);
    }

, , , 。 , 。 , 。 Quadrangle :


public interface Quadrangle {
    long getWidth();
    long getHeight();
}

Rectangle :


public class Rectangle implements Quadrangle {
private long height;
private long width;
@Override
public long getWidth() {
return width;
}
public long getHeight() {
return height;
}
public void setHeight(long height) {
this.height = height;
}
public void setWidth(long width) {
this.width = width;
}
}

Square :


public class Square implements Quadrangle {
private long length;
public long getLength() {
return length;
}
public void setLength(long length) {
this.length = length;
}
@Override
public long getWidth() {
return length;
}
@Override
public long getHeight() {
return length;
}
}

, resize() Quadrangle , 。 Square setWidth() setHeight() 。 , ,resize() Rectangle 。

 

좋은 웹페이지 즐겨찾기