- 开闭准则(Open Closed Principle,OCP):当利用的需要扭转时,在不批改软件实体的源代码或者二进制代码的前提下,能够扩大模块的性能,使其满足新的需要。
- 里氏替换准则(Liskov Substitution Principle,LSP):子类能够扩大父类的性能,但不能扭转父类原有的性能。也就是说:子类继承父类时,除增加新的办法实现新增性能外,尽量不要重写父类的办法。
- 依赖倒置准则(Dependence Inversion Principle,DIP):高层模块不应该依赖低层模块,两者都应该依赖其形象;形象不应该依赖细节,细节应该依赖形象。其核心思想是:要面向接口编程,不要面向实现编程。
违反依赖倒置准则代码(顾客每更换一家商店,都要批改一次代码,这显著违反了开闭准则。存在以上毛病的起因是:顾客类设计时同具体的商店类绑定了,这违反了依赖倒置准则):
class Customer{ public void shopping(ShaoguanShop shop){ //购物 System.out.println(shop.sell()); }}class Customer{ public void shopping(WuyuanShop shop){ //购物 System.out.println(shop.sell()); }}
批改后的合乎依赖倒置准则代码(定义“婺源网店”和“韶关网店”的独特接口 Shop,顾客类面向该接口编程,其代码批改如下:):
public class DIPtest{ public static void main(String[] args){ Customer wang=new Customer(); System.out.println("顾客购买以下商品:"); wang.shopping(new ShaoguanShop()); wang.shopping(new WuyuanShop()); }}//商店interface Shop{ public String sell(); //卖}//韶关网店class ShaoguanShop implements Shop{ public String sell(){ return "韶关土特产:香菇、木耳……"; } }//婺源网店class WuyuanShop implements Shop{ public String sell(){ return "婺源土特产:绿茶、酒糟鱼……"; }} //顾客class Customer{ public void shopping(Shop shop){ //购物 System.out.println(shop.sell()); }}
- 繁多职责准则(Single Responsibility Principle,SRP):繁多职责准则规定一个类应该有且仅有一个引起它变动的起因,否则类应该被拆分
- 接口隔离准则(Interface Segregation Principle,ISP):要为各个类建设它们须要的专用接口,而不要试图去建设一个很宏大的接口供所有依赖它的类去调用。
- 迪米特法令(Law of Demeter,LoD)又叫作起码常识准则(Least Knowledge Principle,LKP):如果两个软件实体毋庸间接通信,那么就不该当产生间接的互相调用,能够通过第三方转发该调用。其目标是升高类之间的耦合度,进步模块的绝对独立性。迪米特法令中的“敌人”是指:以后对象自身、以后对象的成员对象、以后对象所创立的对象、以后对象的办法参数等,这些对象同以后对象存在关联、聚合或组合关系,能够间接拜访这些对象的办法。
public class LoDtest{ public static void main(String[] args){ Agent agent=new Agent(); agent.setStar(new Star("林心如")); agent.setFans(new Fans("粉丝韩丞")); agent.setCompany(new Company("中国传媒有限公司")); agent.meeting(); agent.business(); }}//经纪人class Agent{ private Star myStar; private Fans myFans; private Company myCompany; public void setStar(Star myStar){ this.myStar=myStar; } public void setFans(Fans myFans){ this.myFans=myFans; } public void setCompany(Company myCompany){ this.myCompany=myCompany; } public void meeting(){ System.out.println(myFans.getName()+"与明星"+myStar.getName()+"见面了。"); } public void business(){ System.out.println(myCompany.getName()+"与明星"+myStar.getName()+"洽淡业务。"); }}//明星class Star{ private String name; Star(String name){ this.name=name; } public String getName(){ return name; }}//粉丝class Fans{ private String name; Fans(String name){ this.name=name; } public String getName(){ return name; }}//媒体公司class Company{ private String name; Company(String name){ this.name=name; } public String getName(){ return name; }}
- 合成复用准则(Composite Reuse Principle,CRP)又叫组合/聚合复用准则(Composition/Aggregate Reuse Principle,CARP):它要求在软件复用时,要尽量先应用组合或者聚合等关联关系来实现,其次才思考应用继承关系来实现。
开闭准则是总纲,它通知咱们要对扩大凋谢,对批改敞开;里氏替换准则通知咱们不要毁坏继承体系;依赖倒置准则通知咱们要面向接口编程;繁多职责准则通知咱们实现类要职责繁多;接口隔离准则通知咱们在设计接口的时候要精简繁多;迪米特法令通知咱们要升高耦合度;合成复用准则通知咱们要优先应用组合或者聚合关系复用,少用继承关系复用。