设计模式:
自理解:并不是java提供的方法而是一种人为手写的方式;实现其推荐实现的功能;
软件设计模式的概念:
软件设计模式(Software Design Pattern),又称设计模式,是一套被
反复使用
、多数人知晓的
、代码设计经验的总结
。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结
,具有一定的普遍性,可以反复使用。学习设计模式的必要性
设计模式的本质是
面向对象设计原则
的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。正确使用设计模式具有以下优点。
可以提高程序员的思维能力、编程能力和设计能力。
使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
设计模式分类:
创建型模式
用于描述"怎样创建对象",它的主要特点是"将对象的创建与使用分离 "。GoF(四人组)书中提供了
单例
、原型
、工厂方法
、抽象工厂
、建造者
等 5 种创建型模式。结构型模式
用于描述如何将
类或对象按某种布局组成更大的结构
,GoF(四人组)书中提供了代理
、适配器
、桥接
、装饰
、外观
、享元
、组合
等 7 种结构型模式。行为型模式
用于描述
类或对象之间怎样相互协作
共同完成单个对象无法单独完成的任务,以及怎样分配职责。GoF(四人组)书中提供了模板方法
、策略
、命令
、职责链
、状态
、观察者
、中介者
、迭代器
、访问者
、备忘录
、解释器
等 11 种行为型模式。
设计模式:
设计模式3大类23种
设计原则:
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员
要尽量根据6条原则来开发程序
,从而提高软件开发效率、节约软件开发成本和维护成本。
开闭原则:
自理解:保证代码的可扩展性,同时已完成的代码
增加或修改功能
时,应扩展原有的代码而不是修改原有的代码
就是说对扩展开放,对修改关闭 。在程序需要进行拓展的时候,
不能去修改原有的代码
,而是要扩展原有代码
,实现一个热插拔的效果。 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。 对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。这样的设计,能够面对需求改变却可以保持相对稳定,从而使系统在第一个版本以后不断推出新的版本;面对需求,
对程序的改动是通过增加新的代码进行的,而不是更改现有的代码
; 所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类
等。
里氏代换原则
自理解:子类调用父类方法必须完全可实现其父类中的方法;
里氏代换原则是Barbara Liskov提出的,这是一种面向对象的设计原则,即
如果我们调用一个父类的方法
可以成功,那么替换成子类调用也应该完全可以运行
。
依赖倒转原则
自理解:将要实现的功能分类写成抽象类或接口,细节
(指组成每个分类的类别中每个实体)
应继承或实现于其;实现高度自由组合(解耦合),使每个细节不影响主类(指高层模块)
的功能,而主类可以自由的切换/调度继承或实现其的分支;高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
接口隔离原则
自理解:接口的实现
不能强行实现于其的类实现该类不需要的方法
,需要可以根据该类需求自己选择性实现方法;(将一个抽象类中多个不同的方法分成多个抽象类每个分配一个方法)
客户端不应该被迫依赖于它不使用的方法
;一个类对另一个类的依赖应该建立在最小的接口上。
迪米特法则
自理解:每一个细节
(指组成每个分类的类别中每个实体)
之间相互隔离,实现其于其他类的关联应由其父类进行;迪米特法则又叫最少知识原则。
只和你的直接朋友交谈,不跟"陌生人"说话(Talk only to your immediate friends and not to strangers)。
其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
迪米特法则中的"朋友"是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
合成复用原则
自理解:将重复的子类继承提取到主类中,通过声明变量达到缩减声明类的效果
尽量使用合成/聚合.避免继承.在新类中应该尽量使用关联关系采用现有的对象,使之成为新对象的一部分.达到现有功能复用的目的. 通过合成聚合的原则可以降低类于类之间的依赖关系.被依赖的类的修改对其他类的影响相对小一些. 合成/聚合原则是动态的.可以自由选择使用现有类的那些方法.而继承是静态的,失去了灵活性.如果父类改变有可能会影响子类的修改,同时破坏了父类的封装性,父类将会暴露不相关的方法给子类.