1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

package com.principle.lsp;

/**
 * 四边形接口
* @Author : liyang
* Description
* @Date : 14:48 2017/12/28
*/
public interface Quadrangle {
    public long getWidth();

    public long getHeigth();

}


package com.principle.lsp;

/**
 *
 * 长方形是四边形的子类
* @Author : liyang
* Description
* @Date : 14:49 2017/12/28
*/
public class Rectangle  implements Quadrangle{
    private long width;
    private long heigth;

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

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

    @Override
    public long getHeigth() {
        return heigth;
    }

    public void setHeigth(long heigth) {
        this.heigth = heigth;
    }
}


package com.principle.lsp;


/**
 *
 * 正方形是四边形的子类,具有赋值方法
* @Author : liyang
* Description
* @Date : 14:56 2017/12/28
*/
public class Square implements Quadrangle {
    private long side;

    public long getSide(){
        return this.side;
    }
    public void setSide(long side){
        this.side = side;
    }

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

    @Override
    public long getHeigth() {
        return getSide();
    }
}


package com.principle.lsp;


/**
 * 里氏代换原则(Liskov Substitution Principle, LSP)
 * 子类可以扩展父类的功能,但不能改变父类原有的功能。
 *
 * 基类Quadrangle类没有赋值方法。因此上面的resize()方法不可能适用于Quadrangle类型,
 * 而只能适用于不同的具体子类Rectangle和Square
* @Author : liyang
* Description
* @Date : 11:48 2017/12/28
*/
public class TestCenter {

    //将长方形变为正方形
    public static void resize(Rectangle r){
        while(r.getWidth()<=r.getHeigth()){
            r.setWidth(r.getWidth()+1);
        }
    }

    public static void main(String[] args) {
        Rectangle r = new Rectangle();
        r.setWidth(1541);
        r.setHeigth(522);
        resize(r);
        System.out.println(r.getWidth());

    }
}
3、依赖倒转原则(Dependence Inversion Principle)

这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5、迪米特法则(最少知道原则)(Demeter Principle)

为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、单一职责原则(Single Responsibility Principle, SRP)

一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。

package com.principle.srp;

public interface FatherInterface {

    public void gotoWork();
    public void gotoCleanHome();

}

package com.principle.srp;

public interface MotherInterface {

    public void gotoLunch();
    public void gotoDinner();

}


package com.principle.srp;

public class Son implements FatherInterface, MotherInterface {

    @Override
    public void gotoLunch() {
        System.out.println("mather lunch");
    }

    @Override
    public void gotoDinner() {
        System.out.println("mather dinner");

    }

    @Override
    public void gotoWork() {
        System.out.println("father Workr");

    }

    @Override
    public void gotoCleanHome() {
        System.out.println("father clean home");
    }


}

package com.principle.srp;

public class Son1 implements MotherInterface {


    @Override
    public void gotoLunch() {
        System.out.println("learn mother goto lunch");
    }

    @Override
    public void gotoDinner() {
        System.out.println("learn mother goto dinner");
    }
}


package  com.principle.srp;
/**
 * 单一性原则   Single responsibility principle
 * 尽量一个接口、类完成一个功能,这样的话后续扩展比较容易,代码可阅读行也会提高
* @Author : liyang
* Description
* @Date : 10:48 2017/12/28
*/
public class TestCenter {

    public static void main(String[] args) {
        FatherInterface fatherInterface;
        MotherInterface motherInterfacel;
        Son son =new Son();
        fatherInterface = son;
        motherInterfacel = son;
        fatherInterface.gotoWork();
        fatherInterface.gotoCleanHome();
        motherInterfacel.gotoLunch();
        motherInterfacel.gotoDinner();

        Son1 son1 = new Son1();
        motherInterfacel = son1;
        motherInterfacel.gotoLunch();
        motherInterfacel.gotoDinner();
    }

}

(更新中。。。)