乐趣区

关于面向对象设计模式:面向对象设计原则

  1. 开闭准则(Open Closed Principle,OCP):当利用的需要扭转时,在不批改软件实体的源代码或者二进制代码的前提下,能够扩大模块的性能,使其满足新的需要。

  1. 里氏替换准则(Liskov Substitution Principle,LSP):子类能够扩大父类的性能,但不能扭转父类原有的性能。也就是说:子类继承父类时,除增加新的办法实现新增性能外,尽量不要重写父类的办法。

  1. 依赖倒置准则(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()); 
    }
}
  1. 繁多职责准则(Single Responsibility Principle,SRP):繁多职责准则规定一个类应该有且仅有一个引起它变动的起因,否则类应该被拆分

  1. 接口隔离准则(Interface Segregation Principle,ISP): 要为各个类建设它们须要的专用接口,而不要试图去建设一个很宏大的接口供所有依赖它的类去调用。

  1. 迪米特法令(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;}
}
  1. 合成复用准则(Composite Reuse Principle,CRP)又叫组合 / 聚合复用准则(Composition/Aggregate Reuse Principle,CARP): 它要求在软件复用时,要尽量先应用组合或者聚合等关联关系来实现,其次才思考应用继承关系来实现。

开闭准则是总纲,它通知咱们要对扩大凋谢,对批改敞开;里氏替换准则通知咱们不要毁坏继承体系;依赖倒置准则通知咱们要面向接口编程;繁多职责准则通知咱们实现类要职责繁多;接口隔离准则通知咱们在设计接口的时候要精简繁多;迪米特法令通知咱们要升高耦合度;合成复用准则通知咱们要优先应用组合或者聚合关系复用,少用继承关系复用。

退出移动版