设计模式

设计模式介绍

  1. 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验, 模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern) 代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时 间的试验和错误总结出来的。
  2. 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂 度。
  3. <<设计模式>> 是经典的书,作者是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides Design(俗称 “四人组 GOF”) 4) 设计模式并不局限于某种语言,java,php,c++ 都有设计模式.

掌握设计模式的层次

  1. 第1层:刚开始学编程不久,听说过什么是设计模式;
  2. 第2层:有很长时间的编程经验,自己写了很多代码,其中用到了设计模式,但是自己却不知道;
  3. 第3层:学习过了设计模式,发现自己已经在使用了,并且发现了一些新的模式挺好用的
  4. 第4层:阅读了很多别人写的源码和框架,在其中看到别人设计模式,并且能够领会设计模式的精妙和带来的好处。
  5. 第5层:代码写着写着,自己都没有意识到使用了设计模式,并且熟练的写了出来。

设计模式的目的

编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重 用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好

  1. 代码重用性 (即:相同功能的代码,不用多次编写)
  2. 可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
  3. 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
  4. 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)
  5. 使程序呈现高内聚,低耦合的特性 分享金句: 设计模式包含了面向对象的精髓,“懂了设计模式,你就懂了面向对象分析和设计 (OOA/D)的精要” Scott Mayers 在其巨著《Effective C++》就曾经说过:C++老手和 C++新手的区别就是 前者手背上有很多伤疤

设计模式的重要性

  1. 软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现) 的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人 在1990年代从建筑设计领域引入到计算机科学的
  2. 大厦 VS 简易房
  3. 拿实际工作经历来说, 当一个项目开发完后,如果客户提出增新功能,怎么办?。
  4. 如果项目开发完后,原来程序员离职,你接手维护该项目怎么办? (维护性[可读性、 规范性])
  5. 目前程序员门槛越来越高,一线IT公司(大厂),都会问你在实际项目中使用过什么 设计模式,怎样使用的,解决了什么问题。
  6. 设计模式在软件中哪里?面向对象(oo)=>功能模块[设计模式+算法(数据结构)]=>框 架[使用到多种设计模式]=>架构 [服务器集群] 7) 如果想成为合格软件工程师,那就花时间来研究下设计模式是非常必要的.

设计模式七大原则

设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模 式的基础(即:设计模式为什么这样设计的依据)
设计模式常用的七大原则有:

  1. 单一职责原则

    1. 降低类的复杂度,一个类只负责一项职责。

    2. 提高类的可读性,可维护性

    3. 降低变更引起的风险

    4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违 反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则

  2. 接口隔离原则

  1. 客户端不应该依赖它不需要的接 口,即一个类对另一个类的依赖 应该建立在最小的接口上

  2. 先看一张图:
    在这里插入图片描述

  3. 类A通过接口Interface1依赖类B,类C通过 接口Interface1依赖类D,如果接口 Interface1对于类A和类C来说不是最小接口, 那么类B和类D必须去实现他们不需要的方 法。

  4. 按隔离原则应当这样处理: 将接口Interface1拆分为独立的几个接口, 类A和类C分别与他们需要的接口建立依赖 关系。也就是采用接口隔离原则

  1. 依赖倒转(倒置)原则

依赖倒转原则(Dependence Inversion Principle)是指:

  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象 ;

  2. 抽象不应该依赖细节,细节应该依赖抽象 ;

  3. 依赖倒转(倒置)的中心思想是面向接口编程;

  4. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的 多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象 指的是接口或抽象类,细节就是具体的实现类

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

  1. 里氏替换原则

    1. 里氏替换原则(Liskov Substitution Principle)在1988年,由麻省理工学院的以为姓里 的女士提出的。

    2. 如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序 P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1 的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。

    3. 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法

    4. 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可 以通过聚合,组合,依赖 来解决问题。

  2. 开闭原则

    1. 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则。

    2. 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用 方)。用抽象构建框架,用实现扩展细节。

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

    4. 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

  3. 迪米特法则

  1. 一个对象应该对其他对象保持最少的了解;

  2. 类与类关系越密切,耦合度越大;

  3. 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的 越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内 部。对外除了提供的public 方法,不对外泄露任何信息 ;

  4. 迪米特法则还有个更简单的定义:只与直接的朋友通信;

  5. 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系, 我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合 等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而 出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量 的形式出现在类的内部。

  1. 合成复用原则

1).原则是尽量使用合成/聚合的方式,而不是使用继承;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写完了Interpreter模式之后,我习惯性的看看下一天的安排,却陡然发现GoF的23个设计模式的解析已经在我不经意间写完了。就像在一年前看GoF的《设计模式》一书,和半年前用C++模拟、实现23种经典的设计模式一般,透过这个写解析的过程,我又看到了另外一个境界。一直认为学习的过程很多时候可以这样划分:自己学会一门知识(技术)、表达出来、教会别人、记录下来,虽然这个排序未必对每个人都合适(因为可能不同人有着不同的特点能力)。学一门知识,经过努力、加以时日,总是可以达到的,把自己学的用自己的话表达出来就必须要将学到的知识加以消化、理解,而教会一个不懂这门知识的人则比表达出来要难,因为别人可能并不是适应你的表述方式,记录下来则需要经过沉淀、积累、思考,最后厚积薄发,方可小成。 设计模式之于面向对象系统的设计和开发的作用就有如数据结构之于面向过程开发的作用一般,其重要性和必要性自然不需要我赘述。然而学习设计模式的过程却是痛苦的,从阅读设计模式的圣经——GoF的《设计模式:可复用面向对象软件的基础》时的枯燥、苦闷、茫无头绪,到有一天突然有一种顿悟;自己去实现GoF的23中模式时候的知其然不知其所以然,并且有一天在自己设计的系统种由于设计的原因让自己苦不堪言,突然悟到了设计模 第 2 页 共 105 页 k_eckel 设计模式精解-GoF 23 种设计模式解析附 C++实现源码 http://www.mscenter.edu.cn/blog/k_eckel 式种的某一个正好可以很好的解决问题,到自己设计的elegant的系统时候的喜悦与思考;一直到最后向别人去讲解设计模式,别人向你咨询设计模式,和别人讨论设计模式。就如GoF在其前言中说到:一旦你理解了设计并且有了一种“Aha!”(而不是“Huh?”)的应用经验和体验后,你将用一种非同寻常的方式思考面向对象设计。这个过程我认为是漫长的,painful,但是是非常必要的。经过了的才是自己的,Scott Mayer在其巨著《Effective C++》就曾经说过:C++老手C++新手区别就是前者背上很多伤疤。是的在软件开发和设计的过程中,失败、错误是最好的老师,当然在系统开发中,失败和错误则是噩梦的开端和结束,因为你很难有改正错误的机会。因此,尽量让自己多几道疤痕是对的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值