1.设计模式与面向对象原则
本文重点在解释什么是设计模式?什么场景下可以用这种设计模式?尝试以实际的问题来驱动学习,使得我们对设计模式的理解更为深刻而具体。
本文的内容分为三部分:
- 面向对象的设计原则
- UML类图定义
- 二十四种设计模式集锦
**设计模式(Design pattern)**是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。只有精通了设计模式,才敢说真正理解了软件工程。可以说,设计模式是每一个架构师所必备的技能之一。
虽然本文代码是基于Java(不管是何种语言,甚至是非OO语言,都能从设计模式中窥探一丝代码架构的奥秘),主要学习资料及图片来源于《大话设计模式》这本书,强烈建议大家阅读原书。
前言
关于面向对象特性,在《大话设计模式》中有一段极其生动的讲解,**面向对象的使用就像活字印刷术一样便捷、高效,**见下图:
第一,要改,只需更改要改之字,此为可维护;第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用;第三,此诗若要加字,只需另刻字加入即可,这是可扩展;第四,字的排列其实可能是竖排可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。
可维护、可复用、可扩展、灵活性好,就是面向对象设计所力求达到的境界。
面向对象的设计原则
设计原则是编程设计过程中需要时刻考虑的,近乎于道,这些设计原则的组合、碰撞,就产生了许多精彩绝伦、可用性极强的设计模式,是可以用的术。之所以称为模式,是因为在日常的编程开发中,我们都可以学习、借鉴它们。
想要精通设计模式,必须要先搞清楚面向对象的的几大设计原则。
**开放封闭原则——**找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起!类应该对扩展开放,对修改关闭。
什么是“变化”?——如果每次需求一来,某个部分就必须改变,那么就是不稳定变化的代码。
**依赖倒置原则——**针对接口编程,而不是针对实现编程。——也可以说要依赖抽象,不要依赖具体类,简称依赖倒置原则。
针对接口编程,其实是“面向超类型(抽象类、接口)”编程。这个原则让编程的细节被隐藏,不会因为修改具体实现而经常改动程序结构。
**接口隔离原则——**为降低依赖,系统的低耦合而努力。
设计模式的出现归根结底是为了让大型软件的升级和维护方便。
**最少知道原则/墨特尔原则——**一个类对自己依赖的类知道的越少越好,一个对象应该对其他对象有最少了解。
一旦某个类应该只与它必须知道的类去交互,而不应该知道其他的类,编程的总原则就是高聚合,低耦合。
**单一职责原则——**对于一个类,应该只有一个引起其变化的原因。
因为如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏,并且也不利于代码的移植(不同平台的代码依赖不同,一旦某些类由于职责过多造成依赖关系混乱不堪,很难进行代码重构)
至于如何确定某个类是否是单一职责,可以反过来想:那就是如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责[ASD],就应该考虑类的职责分离,即将其拆分为更小的类。
**里氏代换原则——**子类型必须能够替换它们的父类型。
换句话说,任何基类可以出现的地方,子类一定可以出现。里氏代换原则其实是对开-闭原则的补充,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
**组合选择原则——**多用组合,少用继承。
虽然继承接口可以让不同子类中实现方式不同,但是接口不具有复用性(每一个接口的实现代码都得重写),而组合却可以为后续的程序设计提供便利。
UML类图
为了在之后的学习中更好地理解设计模式,我们需要先学习一下如何绘制、阅读UML类图。绘制UML类图,可以使用Visio或者Drawio。以下面这幅图为例,捋清常见的关系,多看并记忆即可:
类名称若为斜体,表示该类为抽象类,即无法创建实例;
类中字段(成员变量)和方法:+ 表示public;-表示private;#表示protected;
继承关系,用空心三角加实线;
接口关系即实现接口,用空心三角加虚线;
关联关系即是某个类是另一个类的成员属性,(如上图企鹅和气候,企鹅需要了解气候)用实线箭头,用代码表示就是:
聚合关系(大雁和雁群,是一种弱拥有关系)是一种弱关联关系,用空心菱形和实线箭头;
合成(组合)关系(鸟和翅膀是强拥有,即整体和局部的关系)是一种contain-a的强关联关系,用实心菱形和实线箭头,两端的底下的数字,表示几对几的关系;
依赖关系(某个类需要基于某个类而存在)表示某个类必须基于一个类存在,一般是在一些成员函数或者构造函数构造时需要,用虚线箭头;
接下来对设计模式的介绍,我会从:定义、场景、解决的方式方便大家的理解。
设计模式集锦
常见的设计模式一共有24种,细分为创建型模式(6种)、结构型模式(7)、行为型模式(11)。我将简要介绍每种设计模式的特点,具体内容会在之后的文章中逐渐更新,敬请期待~
创建型模式,共六种:
- 简单工厂模式:静态工厂方法;
- 工厂模式:创建对象的接口;
- 抽象工厂模式:创建一系列相关或依赖的对象;
- 单例模式:限制某个类只有一个实例;
- 建造者模式:分步、渐次创建复杂对象;
- 原型模式:通过复制已有实例来创建新实例;
结构型模式,共七种:
- 适配器模式:接口转换器;
- 装饰器模式:动态地给对象增加方法;
- 代理模式:通过代理控制对象访问;
- 外观模式:提供简单接口,隐藏复杂接口;
- 桥接模式:分离抽象部分与具体方法实现;
- 组合模式:组合模式使得用户对单个对象和组合对象的使用具有一致性;
- 享元模式:通过共享细粒度对象来节省内存;
行为型模式,共十一种:
- 策略模式:将各类算法封装起来,并使其可以相互替换;
- 模板方法模式:定义算法步骤,并由子类进行具体实现;
- 观察者模式:定义了对象之间地一对多的依赖关系;
- 迭代器模式:提供一种方法来访问聚合对象中各个元素;
- 责任链模式:将请求沿着处理者链路依次传递;
- 命令模式:将请求封装为对象,在上下文中进行参数化;
- 备忘录模式:保存和回复对象的内部状态;
- 状态模式:对象状态改变时执行对应的行为;
- 访问者模式:在不改变对象接口的前提下,定义作用于对象的新方法;
- 中介者模式:将对象间的交互封装在交互类中;
- 解释器模式:给定语言定义的文法,解释相关内容;
注:设计模式有的说是23种,是因为没有把简单工厂模式单独提出来。
参考资料
**让我们一起来学习设计模式吧!项目地址:**https://github.com/white0dew/Learning-Design-pattern/tree/master
《大话设计模式》
设计模式分类
1.设计模式与面向对象原则相关推荐
- JavaScript 设计模式的七大原则(未完成)
设计模式(面向对象)有七大设计原则,分别是: 开闭原则:对扩展开放,对修改关闭 单一职责原则:每一个类应该专注于做一件事情 里氏替换原则:父类存在的地方,子类是可以替换的 依赖倒转原则:实现尽量依赖抽 ...
- Java设计模式-七大设计原则
Java设计模式 设计模式七大原则 设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好 代码 ...
- 面向对象原则之GOF是招式,九大原则才是精髓
转自:www.cnblogs.com/skyhecheng/archive/2007/09/06/883888.html 只有到了一定层次后才会真正的深入体会到面向对象的一些知识点啊! 不谈具体程 ...
- 设计模式 分类和原则
为什么80%的码农都做不了架构师?>>> 设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型 ...
- 设计模式之SOLID原则再回首
本科阶段学过设计模式,那时对设计模式的五大原则--SOLID原则的概念与理解还是比较模糊,此时过去了2年时间,在学习<高级软件工程>课程中老师又提到了设计模式,课程中还详细讨论了五 ...
- Java 23种设计模式案例:原则及分类
2019独角兽企业重金招聘Python工程师标准>>> 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模 ...
- 设计模式 - 七大设计原则(一)
设计模式 - 七大设计原则(一) 概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个 ...
- 设计模式-里氏替换原则
设计模式-里氏替换原则 优点 面向对象的语言继承必不可少的,有如下优点 代码共享,减少创建类的工作量 提高代码的重用性 提高代码的可扩展性 提高代码的可扩展性 提高产品代码的开放性 继承侵入性 只要继 ...
- 大话设计模式之设计原则
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 原则指的 ...
最新文章
- 新人新博客新学习家园
- html中透明度怎么写,css中控制透明度
- 【Jupyter Notebook】启动命令行(写进.sh文件直接调用shell)
- C语言引用文件空格和换行,关于文件操作,碰到空格就换行
- 高通要大干无人机芯片 耗时一年获总部飞行许可
- 类加载器-双亲委派-源码分析2
- STM8 ADC转换模式-------单次扫描模式
- 结合CDIB类,对图像的打开、显示、保存
- 软工作业PSP与单元测试训练 15100231
- Command(命令)
- 解决WindowsBuilder不能打开别人代码的design窗口(不显示Source 和 Design)
- nexus下载安装和创建maven私库
- java 创建Reader_BufferedReader类的对象建立问题(JAVA语言)
- RxSwift学习笔记
- 大厂面试必考题:三行布局之圣杯布局和双飞翼布局的区别
- php当下前景怎么样,最适合当下的趋势策略,详细写给你看(7月13日 指数分位点)...
- Ceph添加OSD节点
- 511遇见安卓手机投屏支持一键转无线群控
- 云商互惠商城源码/大型买返商城源码,返利商城源码
- Maven 的 Lifecycle 和 plugins
热门文章
- 不小心格式化内存卡之后怎么找回丢失数据?
- Android基于rxjava2+retrofit2实现断点续传下载,模拟支付宝更新app
- printf在c++使用
- Android ADT——快速更新API
- Android兼容性测试GTS-环境搭建、测试执行、结果分析
- 打造灵动办公新体验,金山数字办公助力建筑央企实现办公“效率+安全“双提升
- 微软 Build 2020开发者大会发来一张英雄帖,邀您速来赴约!
- Web(FlatScience)
- 2020 CCPC Wannafly Winter Camp Day6 M—自闭——模拟
- Wi-Fi 20mhz 和 40mhz 频段带宽的区别是什么? 图解