- 什么是设计模式?
- 设计模式分为哪几种?
什么是设计模式?
设计模式的六大原则
1、开闭原则(
Open Close Principle
)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类
2、里氏代换原则(
Liskov Substitution Principle
)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科
3、依赖倒转原则(
Dependence Inversion Principle
)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(
Interface Segregation Principle
)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(
Demeter Principle
)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(
Composite Reuse Principle
)
原则是尽量使用合成/聚合的方式,而不是使用继承。
总结
设计模式是对软件设计中常见问题,找出的可重用解决方案。它并不依托具体的语言。换言之Java可以使
用,其他的面向对象的语言也可以。设计模式不是可以直接转换为代码的已完成设计,它只是一种在许多不
同情况下用于解决问题的表述或者模板。
面向对象的设计模式通常显示类或对象之间的关系和交互,并不指定相关的最终应用程序类或者对象。
很多模式只意味着面向对象,或者更为普遍的可变状态,因此可能不适用于数据不可变或被视为不可
变的函数式编程语言。
设计模式通常使用统一标记语言(UML) 来描述 - UML用一个类图显示构成设计模式的组件之间的关系。
此外,UML具有大量的富有表达性的词汇,有助于描述模式的细节。
设计模式分为哪几种?
“四人帮”(Gang of Four)设计模式
创建型模式:
英文名 | 中文名 | 备注说明 |
---|---|---|
singleton |
单例 | 分为懒汉式和饿汉式 |
factory-method |
工厂方法 | 需要通过多分支判断或是独立方法创建指定的对象,不符合开闭原则,可以通过与Spring的连用消除,比较常用 |
abstract-factory |
抽象工厂 | 符合开闭原则,但是会造成类的增多,项目复杂性变大 |
builder |
建造者 | 只能增加产品族,不能增加单个种产品 |
prototype |
原型 | 当对象new出来要消耗很多时间或是资源的时候,用原型方式创建是个很好的选择,Spring底层和js Prototype就是一个原型模式 |
结构型模式:
英文名 | 中文名 | 备注说明 |
---|---|---|
adapter |
适配器 | 通过实现Target接口,并将适配接口设置为成员属性,实现或是继承适配接口 |
proxy |
代理 | 分为静态和动态代理模式 |
composite |
组合 | 树形结构,XML和HTML解析,Junit就是一个比较典型的例子 |
decorator |
装饰 | 扩展对象功能,比继承更灵活,不会导致类个数急剧增加,但是会产生很多小对象,java种的IO流处理就是用了这个模式, |
bridge |
桥接 | |
facade |
外观 | 比较常用的模式,很多时候我们都要用这种模式对我们所编写的单元进行封装,使他人只需要很少的了解,就可以使用我们的程序 |
flyweight |
享元 | 高效的支持大量细粒度对象的重用,但是这是一种以时间换空间的方式,String类,线程池,数据库链接池等都是采用该模式 |
行为型模式:
英文名 | 中文名 | 备注说明 |
---|---|---|
iterator |
迭代器 | 提供一种可以遍历聚合对象的方式,又称为cursor模式 |
mediator |
中介 | 解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道,通过中介者进行统一的管理 |
command |
命令 | |
chain-of-responsibility |
责任链 | 环环相扣,一个事件的处理,按事件的情况由不同的类来处理,即可以责任链模式,比如员工请假以天数为基准,用负责人,副总经理,总经理批准 |
interpreter |
解释器 | 增加了新的解释表达式的方式,但是执行效率比较低,可利用场景比较少。 |
visitor |
访问者 | 对于存储一个集合的对象,他们可能具有不同的类型(即使有一个公共的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问者其访问方式也有所不同(不常用,了解即可) |
strategy |
策略 | 解决某一问题的算法族,用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或是增加新算计 |
observer |
观察者 | 主要用于1:N的通知。当一个对象(目标对象Subject或Observable)的状态变化是,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应。通知观察者的方式有推 和拉
|
memento |
备忘录 | |
template-method |
模板方法 | 处理步骤父类中定义好了,具体实现延迟到子类中定义 |
state |
状态 | 用于复杂对象的状态下行为的封装问题 |
网友评论