2.0 - デザインパターンソフトウェアアーキテクチャ設計の7つの原則 - リヒターの置換原則

リヒター置換原理(リスコフの置換原則、LSP)は、そのPで定義されたすべてのプログラムは、すべてのオブジェクトに置き換えられるようにT1 O1のそれぞれのオブジェクトタイプ、O2はタイプT2とT1の目的である場合O1、O2手段、プログラムPの挙動が変更されていない場合、タイプは、タイプT2 T1のサブタイプです。定義は、我々はソフトウェアエンティティとして理解することができるかの新しい理解をかなり抽象的な持っているように見える、親、該当する場合は、それは、彼らのサブカテゴリにオブジェクトを透過的にそのサブクラスを使用することができなければならない親クラスへのすべての参照を適用する必要があります、サブクラスのオブジェクトは、親オブジェクトに置き換え、およびプログラムロジックを変更することができます。この理解によると、我々は要約します:

拡張意味:サブクラスは親クラスの機能を拡張することができますが、元の関数の親クラスを変更することはできません。1、サブクラスの親クラスは抽象メソッドを実装することができますが、非抽象親クラスをカバーすることができません。2、サブクラスは、独自のユニークな方法を追加することができます。図3に示すように、親クラスのサブクラスオーバーロードメソッドを予め調整するとき(すなわち、へ/パラメータを入力するための方法)よりリラックスした親クラスのメソッドより入力パラメータ。図4に示すように、親クラスの実装サブクラス(書き換え/又は抽象メソッドオーバーロードを実装する)、よりプロセス(即ち、プロセス出力/戻り値)の事後条件またはより厳しい親に等しい方法。

 

私たちは、割引書き換えを取得する時にgetPriceの親クラス()メソッドをカバーすることを覚えているとき開口部の前でいえばと原則を閉じると、ヒントを築い明らかリヒターに違反し、)(getOriginPriceのソースコードを取得するメソッドを追加します置換原則。私たちは、コードを変更、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;
    }
}

長方形、正方形スクエアを継承するクラスを作成します。

/**
 * @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 方法结束" +
                "\nwidth:"+rectangle.getWidth() + ",height:"+rectangle.getHeight());
    }


    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle();
        rectangle.setWidth(20);
        rectangle.setHeight(10);
        resize(rectangle);
    }
}

長方形で、幅よりも大きいときには、非常に正常な状況です。今、私たちは、テストコードを変更し、長方形の長方形スクエア広場サブクラスを交換し、次のコードを、見て:

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

私たちは、死のサイクルを実行します。この時間はサブクラスで、プログラムの結果は期待を満たしていない親クラスを置き換えるために、リヒターの置換原則に反して登場しました。したがって、我々のコードの設計は一定のリスクがあります。リヒターの置換原則は、親と子クラス、継承の制約の洪水の間に存在します。私たちは、に基づいている正方形の抽象四角形四角形インターフェースを備えた長方形を作成するために一緒に来ます:

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

クラスの長方形の四角形を変更します。

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;
}
}

正方形のクラススクエアカテゴリを変更します。

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;
}
}

我々は四角形四角形の中にクラスのサイズ変更パラメータ()メソッドを置く場合は、この時点では、内部方法が与えられます。正方形のスクエアは何にsetWidthを持っていないので()とsetHeightメソッド()メソッドを持っています。したがって、継承の増殖を制限するために、リサイズ()メソッドのパラメータは、矩形を矩形ことができます。

 

おすすめ

転載: blog.csdn.net/madongyu1259892936/article/details/93631675