`

设计模式总说

阅读更多

对于一个对设计模式还不是很熟练运用的初学者,读完了head first设计模式 这本书,觉得写的非常好,容易读懂掌握。下面是对设计模式的一个整理。

 

分类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

 

除了以上分类方式,设计模式还可以分为类模式和对象模式

类模式包括:模板模式、工厂模式,适配器模式 interpreter模式

类模式描述类之间的关系如何通过继承定义,类模式的关系是在编译时建立的。对象模式描述对象之间的关系。而且主要是利用组合定义,对象的关系通常在运行时建立,更加动态更加有弹性。

 

常用模型:

策略:封装可互换的行为,并使得委托决定使用哪一个

适配器:封装对象并提供不同的接口

迭代器:提供一个类的方式来遍历集合 ,而无需暴露结合的实现。

外观:简化一群类的接口

观察者:当某个状态改变时允许一群对象被通知到。

装饰者模式:包装一个对象以提供新的行为

状态模式:封装了基于状态的行为,并使用委托在行为之间切换。

代理:包装对象,以控制对此对象的访问。

工厂方法,由子类确定要创造的具体类是哪一个

模板方法:由子类觉得如何实现一个算法中的步骤

组合:客户用一致的方式处理对象集合和单个对象,一视同仁

单件模式:确保有且仅有一个对象被创建

抽象工厂:允许客户创建对象的产品族,而无需指定他们的具体类

命令:封装请求称为对象。

 

 设计原则

设计模式并不是用就好,一定要考虑是否真的合适。相对设计模式我们更应该知道设计模式里面的设计原则。

在headfirst中提到以下几种设计原则,之所以举例出来,是因为他简单好懂

1、封装可变性:找出应用中可能需要变化的部分之处,把她们独立起来,不要和那些不需要变化的代码混在一起。

2、针对接口编程而不要针对实现编程,既针对超类型编程,通常是一个接口或者抽象类,让编程有弹性,不会写死

3、多用组合,少用继承(继承会破坏封装;父类实现改变,子类受牵连;继承静态不能动态改变。 组合不破坏封装;动态;依靠接口但会增加数量)

4、为了交互对象之间的松耦合设计而努力。

5、开闭原则 :类应该对扩展开放,对修改关闭

6、依赖导致原则:要依赖抽象,不要依赖具体类, 抽象不应当依赖于细节;细节应当依赖于抽象。

7、迪米特法则(最少知识原则):只和你的密友谈话。

8、好莱坞原则:别调用(打电话给)我们,我们会调用(打电话)你。 

10、单一职责原则:一个类应该只有一个引起变化的原因。

 

我们常说的设计原则如下

单一职责原则

定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 

问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。

解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。

说到单一职责原则,很多人都会不屑一顾。因为它太简单了。稍有经验的程序员即使从来没有读过设计模式、从来没有听说过单一职责原则,在设计软件时也会自觉的遵守这一重要原则,因为这是常识。在软件编程中,谁也不希望因为修改了一个功能导致其他的功能发生故障。而避免出现这一问题的方法便是遵循单一职责原则。虽然单一职责原则如此简单,并且被认为是常识,但是即便是经验丰富的程序员写出的程序,也会有违背这一原则的代码存在。为什么会出现这种现象呢?因为有职责扩散。所谓职责扩散,就是因为某种原因,职责P被分化为粒度更细的职责P1和P2。

 

里氏替换原则

定义:有引用基类的地方必须能透明地使用其子类的对象。

问题由来:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障。

解决方案:当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。

继承包含这样一层含义:父类中凡是已经实现好的方法(相对于抽象方法而言),实际上是在设定一系列的规范和契约,

虽然它不强制要求所有的子类必须遵从这些契约,但是如果子类对这些非抽象方法任意修改,就会对整个继承体系造成破坏。而里氏替换原则就是表达了这一层含义。

 

依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在java中,抽象指的是接口或者抽象类,

细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

 

接口隔离原则

定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 

问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

 

迪米特法则

定义:一个对象应该对其他对象保持最少的了解。

问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。

解决方案:尽量降低类与类之间的耦合。

 

开闭原则 

定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

问题由来:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。

解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

 
 

 

 

 

 

 

 

分享到:
评论

相关推荐

    C_设计模式(23种设计模式)

    C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    设计模式精解 设计模式精解

    设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式 设计模式精解设计模式精解设计模式精解...

    Java设计模式 设计模式介绍

    章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...

    24种设计模式以及混合设计模式

    24中设计模式 混合设计模式 设计模式实际应用案例 费了很多时间和精力整理的

    设计模式课程设计

    设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式设计模式

    DAO设计模式DAO设计模式

    DAO设计模式DAO设计模式DAO设计模式DAO设计模式DAO设计模式DAO设计模式DAO设计模式DAO设计模式DAO设计模式DAO设计模式

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    写完了Interpreter模式之后,我习惯性的看看下一天的安排,却陡然发现GoF的23个设计模式的解析已经在我不经意间写完了。就像在一年前看GoF的《设计模式》一书,和半年前用C++模拟、实现23种经典的设计模式一般,透过...

    C#设计模式_C#设计模式_

    C# 设计模式.pdf 文档。无论您是新手,还是老手,本教程都值得一读。对于那些具有丰富的开发经验的开发人员,学习设计模式有助于了解在软件开发过程中所面临的问题的最佳解决方案;对于那些经验不足的开发人员,学习...

    Gof设计模式设计模式设计模式PDF

    学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料

    设计模式 四人帮设计模式

    设计模式 四人帮设计模式。比较经典的设计模式。

    设计模式精解- GoF 23种设计模式解析附C++实现源码

    设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在...

    DAO设计模式 DAO 设计模式 JAVA设计模式

    DAO设计模式 DAO 设计模式 JAVA设计模

    人人都懂设计模式 人人都懂设计模式

    人人都懂设计模式 人人都懂设计模式

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...

    JAVA设计模式chm文档

    设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计...

    基于Java的设计模式大作业绘图系统【六种设计模式+文档】.zip

    本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。 具体实现过程、UML类图以及实现效果详见如下项目说明地址: ... 该系统为绘图系统,该系统通过...

    设计模式,分布式设计模式,Java设计模式

    设计模式,分布式设计模式,Java设计模式,软件设计模式

    设计模式课件大全

    设计模式02 设计模式03-创建型模式 设计模式04-创建型模式2 设计模式05-建造者、原型模式 设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、...

    java设计模式pdf

    java设计模式,java设计模式,java设计模式,java设计模式,java设计模式,java设计模式,java设计模式,java设计模式,

Global site tag (gtag.js) - Google Analytics