设计模式六大原则
六大原则
开闭原则:对扩展开放,对修改关闭。比如工厂方法模式,新增类型就新增工厂实现类,这样实现了对扩展开放。
依赖倒转原则:(接口实现)针对接口编程(因为接口没有任何具体实现),依赖于抽象而不依赖于具体。这是开闭原则的基础,因为依赖的是接口,所以才能做到扩展不同的子类都适用,例如工厂方法模式里factory.product(),这里的factory是一个接口,无论
里氏代换原则:(类的继承)子类可以扩展但不能重写父类的方法,不能影响原有功能的实现,否则就不能代换。反之,父类出现的任何地方,都可以用任意一个子类去替换。(实际开发中经常重写,容易出错)。
接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。这样调用者只能访问它自己的方法,屏蔽不需要的方法(比如实现权限管理)
迪米特法则: 最少知道原则,设计模式的门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子。?
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。(has - a ,而不是 is -a,和里氏代换原则相反) ?
解释
依赖倒转原则:让行为去依赖抽象,让调用者动态的去实现具体的细节.这样才可以实现对扩展开放,如果依赖的是具体的话,则无法扩展。
例如司机开车:如果依赖于具体的某种车型的车,则无法扩展,每次新增加一种车,都要修改Driver类,添加新车的开法。如果依赖Car抽象类的话,就可以动态扩展了,不管给任何Car的实现类,都可以run()public class Dirver{public void driveBMW(BMW bmw){bmw.run();}public void driveBenz(Benz benz){benz.run();}public void driveCar(Car car){car.run();}}接口隔离原则
使用场合,提供调用者需要的方法,屏蔽不需要的方法.满足接口隔离原则.比如说电子商务的系统,有订单这个类,有三个地方会使用到,一个是门户,只能有查询方法。一个是外部系统,有添加订单的方法,一个是管理后台,添加删除修改查询都要用到.//门户查询interface IOrderForPortal{String getOrder();}//外部系统 查看和新增interface IOrderForOtherSys{String insertOrder();String getOrder();}//管理员系统 增删改查interface IOrderForAdmin{ //extendsIOrderForPortal,IOrderForOtherSysString deleteOrder();String updateOrder();String insertOrder();String getOrder();}class Order implements IOrderForPortal,IOrderForOtherSys,IOrderForAdmin{private Order(){//--什么都不干,就是为了不让直接 new,防止客户端直接New,然后访问它不需要的方法.}//返回给Portalpublic static IOrderForPortal getOrderForPortal(){return (IOrderForPortal)new Order();}//返回给OtherSyspublic static IOrderForOtherSys getOrderForOtherSys(){return (IOrderForOtherSys)new Order();}//返回给Adminpublic static IOrderForAdmin getOrderForAdmin(){return (IOrderForAdmin)new Order();}//--下面是接口方法的实现.只是返回了一个String用于演示public String getOrder(){return "implemented getOrder";}public String insertOrder(){return "implementedinsertOrder";}public String updateOrder(){return "implementedupdateOrder";}public String deleteOrder(){return "implementeddeleteOrder";}}public class TestCreateLimit{public static void main(String[] args){IOrderForPortal orderForPortal =Order.getOrderForPortal();IOrderForOtherSys orderForOtherSys =Order.getOrderForOtherSys();IOrderForAdmin orderForAdmin = Order.getOrderForAdmin();System.out.println("Portal门户调用方法:"+orderForPortal.getOrder());System.out.println("OtherSys外部系统调用方法:"+orderForOtherSys.insertOrder());System.out.println("Admin管理后台调用方法:"+orderForAdmin.getOrder()+";"+orderForAdmin.insertOrder()+";"+orderForAdmin.updateOrder()+";"+orderForAdmin.deleteOrder());}}里氏代换原则
比如计算器父类,有加减乘除的功能。现在有Deli牌计算器,提供相加后翻倍的功能, (A+B)*2,这个时候实现这个功能不能去重写add()方法,而是扩展一个 addAndDouble()的方法,这样别人在调用的时候,习惯了add就是相加,如果要相加后加倍就调用addAndDouble()。
好处是:任何一个会使用计算器的人,不管使用什么牌子的计算器,点 add()键,相加的逻辑都不会变。