设计模式(Design pattern)是很多程序员总结出来的优秀实践。保证了代码的可重用性、易读性以及代码的可靠性。设计模式使代码编制真正实现工程化,它是是软件工程的基石脉络,如同大厦的结构一样。
提到设计模式,不得不感谢GoF(Gang of Four,四人组),他们1995年出版的《设计模式》一书,第一次将设计模式提升到理论高度,并将之规范化。书中一共总结了23种基本的设计模式。而这23中设计模式几乎涵盖了面向对象设计过程中所有问题的解决方案。书中提到的23种设计模式分别是:
1.单例模式 2.工厂方法模式 3.抽象工厂模式 4.模版方法模式 5.建造者模式 6.代理模式 7.原型模式 8.中介者模式 9.命令模式 10.责任链模式 11.装饰模式 12.策略模式 13.适配器模式 14.迭代器模式 15.组合模式 16.观察者模式 17.门面模式 18.备忘录模式 19.访问者模式 20.状态模式 21.解释器模式 22.享元模式 23.桥梁模式
设计模式六大原则
1、开闭原则OCP
对扩展开放、对修改关闭。通俗一点的讲,在程序需要进行功能扩展的时候,不可去修改原有的代码。这样做的意义在于,延伸了程序的扩展性的同时,使得项目版本升级更方便,代码更易维护。
2、里氏代换原则LSP
所有引用基类(父类)的地方必须能透明地使用其子类的对象,举一个通俗易懂的例子来帮助理解:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。
相信上面这个例子不难理解吧,那我们再来一个程序中的例子:例如有两个类,一个类为BaseClass父类,另一个是SubClass子类,那么一个方法如果可以接受一个BaseClass类型的基类对象base的话,如:method1(base),那么它必然可以接受一个BaseClass类型的子类对象sub,如:method1(sub),都是可以正常运行的。反过来的代换不成立,如果一个方法method2可以接受子类对象sub为参数:method2(sub),那么一般而言不可以接受父类对象base,除非是重载方法。一句话来概括一下吧,能够接受父类引用的方法,必然可以接受子类;而可以接受子类引用的方法,却不能接受父类引用。
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能,假如我们不遵循里氏替换原则,那么写的代码出问题的概率会大大增加。
3、控制反转原则IOC
控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。
在传统的实现中,由程序内部代码来控制程序之间的关系。我们经常使用new关键字来实现两组键间关系的组合,这种实现的方式会造成组件之间耦合(一个好的设计,不但要实现代码重用,还要将组件间关系解耦)。IoC很好的解决了该问题,它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在运行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部的容器来完成。这里有著名的好莱坞理论:你呆着别动,到时我会找你。但是我们使用时候要注意一个问题,静态类的使用会导致IoC设计原则受到限制,因为在Java世界,类的名称是硬编码的,所以静态类的使用会导致类之间通过名称绑定在一起,这使得单独测试某个组件变得更加困难。
4、接口隔离原则ISP
建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
5、迪米特法则DP
如果两个软件实体无需直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
优点
降低类与类之间的耦合度
提高了类的可复用率和系统的扩展性
缺点
过度使用会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。
6、合成复用原则
在实现复用时应该多用关联,少用继承。
通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的内部细节通常对子类来说是可见的,所以这种复用又称“白箱”复用,如果基类发生改变,那么子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;
由于组合或聚合关系可以将已有的对象(也可称为成员对象)纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能,这样做可以使得成员对象的内部实现细节对于新对象不可见,所以这种复用又称为“黑箱”复用,相对继承关系而言,其耦合度相对较低,成员对象的变化对新对象的影响不大,可以在新对象中根据实际需要有选择性地调用成员对象的操作;合成复用可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的其他对象。
在软件设计的过程中,只要我们尽量遵循以上六条设计原则,设计出来的软件一定会是一个优秀的软件,它必定足够健壮、足够稳定,并以极大的灵活性来迎接随时而来的需求变更等因素
这里我只是简要概括了6大原则的核心思想,附上我认为讲的很透彻的大神博客地址:https://blog.csdn.net/zhengzhb/category_9260995.html
其中最最经典的一句就是用抽象构建框架,用实现扩展细节。