设计模式是一套被反复使用、多人知晓的、经过分类编写目的、代码代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现实中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题。以及该问题的核心解决方案,这也是它能被广泛应用的原因。
1. 开闭原则
开闭原则就是对扩展开放,对修改关闭。在程序需要进行扩展的过程中,不修改原有的代码,实现一个热插拔的效果。为了使程序的扩展性好,易于维护升级,尽量采用面向接口的编程。
(一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。)
2. 里氏代换原则
<!--在任何父类出现的地方都可以用他的子类来替代。子类可以扩展父类的功能,但不能改变父类原有的功能。-->
(子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。)
-
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
-
子类中可以增加自己特有的方法。
-
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。【注意区分重载和重写】
-
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
3. 依赖倒转原则
针对接口编程,依赖于抽象而不依赖于具体。使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。(高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的抽象是中国人,而不是你是xx村的。)
-
代码示例
司机接口
public interface IDriver { public void driver(ICar car); }
司机实现类
public class Driver implements IDriver { public void driver(ICar car) { car.run(); } }
汽车接口
public interface ICar { public void run(); }
汽车实现类
public class Benz implements ICar { public void run() { System.out.println("奔驰汽车开始运行..."); } }
public class BMW implements ICar { public void run() { System.out.println("宝马汽车开始运行..."); } }
场景类
public class Client { /** * @param args */ public static void main(String[] args) { IDriver zhangSan = new Driver(); ICar benz = new Benz(); zhangSan.driver(benz); } }
4. 接口隔离原则
建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。(设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。)
5.迪米特法则(最少知道原则)
一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。
要降低耦合
6.组合或聚合复用原则:
多使用聚合或组合达到代码的重用,少使用继承复用。