正文

一、设计原则

1、封装变化

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

2、针对接口编程,不针对实现编程

“针对接口编程”真正的意思是“针对超类型编程”。

超类型可以是抽象类或者接口,关键是要利用多态,这样程序执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。

“针对超类型编程”可以更明确地说成:变量的声明类型应该是超类型,如此,只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量。这也意味着,声明类时不用理会以后执行时的真正对象类型。

3、多用组合,少用继承

“有一个”一般比“是一个”更好。换句话说,通过在类中持有其他类来获得新的行为一般会比通过继承来获得新的行为好。

“组合”就是将多个类组合起来使用,即在一个类中持有其他类的引用。

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

“松耦合”使对象之间的互相依赖降到了最低。如此一来,当一个对象发生改变时,对其他对象的影响也降到了最低。

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

应该让类在不修改现有代码的情况下,就可搭配新的行为。

6、依赖倒置原则:要依赖抽象,不要依赖具体类

不能让高层组件依赖低层组件,而且,不管高层或低层组件,都应该依赖于抽象。

所谓“高层”组件,是指由其他低层组件定义其行为的类。

避免违反依赖倒置原则的指导方针:

  • 变量不可以持有具体类的引用。
  • 不要让类派生自具体类。
  • 不要覆盖基类中已实现的方法。

7、最少知识原则:减少对象之间的交互,只留下几个“密友”

不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。

为了避免违反最少知识原则,在对象的方法内,我们只应该调用属于以下范围的方法:

  • 该对象本身。
  • 被当作方法的参数而传递进来的对象。
  • 此方法所创建或实例化的对象。
  • 对象的组件,即被实例变量所引用的对象。

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

在好莱坞原则下,我们允许低层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些低层组件。

换句话说,高层组件对待低层组件的方式是“别调用我们,我们会调用你”。

9、单一责任原则:一个类应该只有一个引起变化的原因

我们知道要避免类内的改变,因为修改代码很容易造成许多潜在的错误。

如果一个类具有两个改变的原因,会使得将来该类的变化机率上升,而当它真的改变时,你的设计中同时有两个方面将会受到影响。

二、定义设计模式

模式是在某情境下,针对某问题的某种解决方案。

  • 情境:应用某个模式的情况。这应该是会不断出现的情况。
  • 问题:你想在某情境下达到的目标,或者某情景下的约束。
  • 解决方案:你所追求的一个通用的设计,它可以用来解决约束、达到目标。

三、设计模式分类

1、创建型模式

创建型模式涉及到将对象实例化,这类模式都提供一个方法,将客户从所需要实例化的对象中解耦。

  • 工厂方法模式:由子类决定要创建的具体类是哪一个。
  • 抽象工厂模式:允许客户创建对象的家族,而无需指定它们的具体类。
  • 单件模式(单例模式):确保有且只有一个对象被创建。
  • 生成器模式(建造者模式):封装一个复杂对象的创建过程。
  • 原型模式:通过复制现有的实例来创建新的实例。

2、行为型模式

行为型模式涉及到类和对象如何交互及分配职责。

  • 策略模式:封装可以互换的行为,并使用委托来决定要使用哪一个。
  • 观察者模式:让对象能够在状态改变时被通知。
  • 命令模式:封装请求成为对象。
  • 模板方法模式:由子类决定如何实现一个算法中的步骤。
  • 迭代器模式:在对象的集合之中游走,而不暴露集合的实现。
  • 状态模式:封装了基于状态的行为,并使用委托在行为之间切换。
  • 责任链模式:为某个请求创建一个对象链。
  • 解释器模式:将每一个语法规则表示成一个类。
  • 中介者模式:封装一系列对象之间的交互。
  • 备忘录模式:在对象外部存储对象的某个状态。
  • 访问者模式:通过访问数据结构中的每个元素,来对元素进行各种操作。

3、结构型模式

结构型模式涉及到类和对象如何被组合以建立新的结构或新的功能。

  • 装饰者模式:包装一个对象,以提供新的行为。
  • 适配器模式:封装对象,并提供不同的接口。
  • 外观模式:简化一群类的接口。
  • 组合模式:客户用一致的方式处理对象集合和单个对象。
  • 代理模式:包装对象,以控制对此对象的访问。
  • 桥接模式:分离抽象与实现,使它们可以独立变化。
  • 蝇量模式(享元模式):运用共享技术,减少对象的创建。

相关文章

《Head First 设计模式》:策略模式

《Head First 设计模式》:观察者模式

《Head First 设计模式》:装饰者模式

《Head First 设计模式》:工厂方法模式

《Head First 设计模式》:抽象工厂模式

《Head First 设计模式》:单件模式

《Head First 设计模式》:命令模式

《Head First 设计模式》:适配器模式

《Head First 设计模式》:外观模式

《Head First 设计模式》:模板方法模式

《Head First 设计模式》:迭代器模式

《Head First 设计模式》:组合模式

《Head First 设计模式》:状态模式

《Head First 设计模式》:代理模式

《Head First 设计模式》:剩下的模式

交流区



微信公众号:惊却一目

个人博客:惊却一目

《Head First 设计模式》:与设计模式相处的更多相关文章

  1. Java设计模式--单列设计模式

    设计模式:解决某一类问题行知最有效的方法.java有23种设计模式 单列设计模式: 解决一个类在内存中只存在一个对象 思路:(要保证对象的唯一性) 1.为了避免其它程序建立该对象,先禁止替他类创建改对 ...

  2. 图解Java设计模式之设计模式七大原则

    图解Java设计模式之设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 单一职责原则 2.3.1 基本介绍 2.3.2 应用实例 2.4 接口隔离原则(Interface S ...

  3. 图解Java设计模式之设计模式面试题

    图解Java设计模式之设计模式面试题 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 1.1.2 设计模式的重要性 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试 ...

  4. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  5. 设计模式 | Catalog设计模式,抵御业务方需求变动

    大家好,这是一个全新的专题--设计模式. 其实可以选择的专题还有好几个,为什么选择设计模式呢?原因也很简单,首先是设计模式简单.易学.干货的文章固然好,但是普适性往往不强.另外一个很重要的点就是设计模 ...

  6. IOS设计模式-组合设计模式

    前言:本篇博文将让你学会软件开发中的"何为树形结构"."何为组合模式"."组合模式可以解决的问题"等相关知识. 内容大纲: 1.树形结构 2 ...

  7. java 的常用设计模式--大话设计模式

    设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...

  8. 大话设计模式-->模板方法设计模式

    在学习java的过程中,我们肯定听到过设计模式这名词,在行业中有这么一句话,若您能熟练的掌握23种设计模式,那么你便是大牛! 好了,废话不多说,今天我跟大家分享一下23种设计模式之一的  模板方法 设 ...

  9. [设计模式] .NET设计模式笔记 - 了解设计模式

    今天在TerryLee的cnblog(http://terrylee.cnblogs.com)里看到了与设计模式相关的整套文章,初学设计模式看完每篇文章后做些笔记和摘抄. ●什么是设计模式,什么是架构 ...

  10. Head First设计模式——策略设计模式

    策略设计模式 说在前面的话 入软件一年啦,平心而论,总算不限于只会钻研些基础的语言语法了,数据结构和算法也恶补的差不多了.所以~趁着现在一边实习一边啃<Head First设计模式>的功夫 ...

随机推荐

  1. IDEA环境配置里的一些error

    1. idea添加edit configuration 没有tomcat图标 File->Setting->Build,Execution,Deployment-->Applicat ...

  2. Centos-系统内存信息-free

    free 显示系统内存信息,包括物理内存.虚拟内存.共享内存和系统缓存 相关选项 -b 以字节byte为单位显示内存使用情况 -k  以k为单位显示内存使用情况 -m 以MB为单位显示内存使用情况 - ...

  3. Linux常用命令代码大全

    arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 – (SMBIOS / DMI ...

  4. P3378 堆(模板)

    P3378 [模板]堆 题目描述 给定一个数列,初始为空,请支持下面三种操作: 给定一个整数 x,请将 x 加入到数列中. 输出数列中最小的数. 删除数列中最小的数(如果有多个数最小,只删除 1 个) ...

  5. 题目:写出一条SQL语句,查询工资高于10000,且与他所在部门的经理年龄相同的职工姓名。

    create table Emp( eid char(20) primary key, ename char(20), age integer check (age > 0), did char ...

  6. C++ 双冒号开头的语法是什么

    z转载:https://blog.csdn.net/LHHopencv/article/details/78353380 命名空间限定.std::string 表示std命名空间下的 string类. ...

  7. arduino中驱动 步进电机

    参考:https://www.arduino.cn/thread-75936-1-1.html 知识点:    步进电机是一种将电脉冲转化为角位移的执行机构.通俗一点讲:当步进驱动器接收到一个脉冲信号 ...

  8. 看动画学算法之:linkedList

    目录 简介 linkedList的构建 linkedList的操作 头部插入 尾部插入 中间插入 删除节点 简介 linkedList应该是一种非常非常简单的数据结构了.节点一个一个的连接起来,就成了 ...

  9. Windows7 组策略错误:“未能打开这台计算机上的组策略对象。您可能没有合适的权限。”

    在 Windows 7 系统下,打开组策略时,出现 组策略错误 -- "未能打开这台计算机上的组策略对象.您可能没有合适的权限.".如下图所示: 解决方案: 1.进入"计 ...

  10. SDN实验 3: Mininet 实验——测量路径的损耗率

    验 3:Mininet 实验--测量路径的损耗率 一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定:初步了解 Mininet 安装时自带的 POX ...