前言

最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过。前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学习耐力还是有的,所以就打算仔细的研究研究设计模式,然后也将设计模式的学习过程记录下来。

GoF的设计模式

Gang of Four,简称GoF,分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides,这四位软件工程学者在1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。软件开发发展到现在设计模式已经不至23种了,但是GoF的23种设计模式还是软件开发种很常用的,所以一般讲解设计模式都是指的GoF的23种设计模式,我以后要学习的设计模式也是这23种设计模式。并且举例子也都是以Java语言为主的。

面向对象设计原则

单一职责原则(Simple Responsibility Principle,SRP)

一个类应该只有一个功能领域的职责,对外只提供一种功能,而引起类变化的原因应该只有一个。单一原则要达到的目的就是高内聚,低耦合。例如有一个用户类,这个用户类中包含用户的属性和用户的行为,这就造成了业务对象和业务逻辑被放在了一起,使得这个类有两种职责,违背了单一职责原则。应该将属性和行为分开,分别设立单独的接口(属性接口,行为接口)和实现类(属性实现类,行为实现类),这样就可以将业务对象和业务逻辑单独分开了。

开闭原则(Open Close Principle,OPC)

一个对象对扩展开发,对修改关闭。通俗的理解是:对类的改动是通过增加代码进行的,而不是改动现有的代码。例如有一个用户行为接口,这个接口已经有两个实现类了,这时有一个需求是要给这个用户新增一个行为,这个时候需要更改用户行为接口,但是这样就违背了开闭原则。真正符号开闭原则的做法是,再写一个新的接口(或抽象类)继承自用户行为接口,然后所有的用户行为实现类都实现这个新的接口(或继承自新的抽象类)。

里氏替换原则(Liskov Substitution Principle,LSP)

在任何父类出现的地方都可以用它的子类来替代。也就是说同一个继承体系中的对象应该有共同的行为特征。在里氏替换原则中,所有引用基类的地方必须能够透明地使用其子类对象。只要有父类出现的地方,子类就能够出现,而且替换为子类不会产生任何错误或异常。反过来,子类出现的地方,替换为父类就可能出现问题了。

里氏替换原则为良好的继承定义了一个规范,具体有4个:

  • 子类必须完成实现父类的方法。
  • 子类可以有自己的特性。
  • 覆盖或者实现父类的方法时输入参数可以被放大。
  • 覆盖或者实现父类的方法时输出结果可以被缩小。

依赖注入原则(Dependence Inversion Principle,DIP)

编程时要依赖于抽象,不要依赖于具体的实现。在应用程序中,所有的类如果使用或依赖于其他的类,则都应该依赖于这些其他类的抽象类(或接口),而不是依赖于这些其他类的具体实现类。

依赖注入原则需要注意的是:高层次模块不应该依赖低层次模块,即使用接口或抽象类进行变量的声明、参数类型的声明、方法返回类型的声明、数据类型状态等,而不要用具体实现类来做这些

依赖注入的实现方式有三种:

  • 通过构造函数传递依赖对象。
  • 通过setter方法传递依赖对象。
  • 接口声明实现依赖对象。

接口分离原则(Interface Segregation Priciple,ISP)

不应该强迫客户程序依赖它们不需要使用的方法。意思就是说,一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所以的操作都封装到一个接口中。

在使用接口分离原则时需要注意几点:

  • 接口尽量小:这主要是为了保证一个接口只服务于一个子模块或一类子模块。
  • 接口高内聚:接口高内聚是对内高度依赖,对外尽可能隔离。即一个接口内部声明的方法相互之间都与某一个子模块相关,且使这个模块必需的。
  • 接口设计是有限度的:如果完全遵循接口分离原则,接口粒度会越来越小,接口数量剧增,会导致系统复杂度大大增加,所以在设计接口时不应该一味的去分离接口。

迪米特原则(最少知识原则-LeastKonwledge Priciple,LKP)

一个软件实体应该尽可能少的与其他软件实体发生相互作用。就是说各个对象或各个类之间应该尽可能降低耦合,提高系统的可维护性。在模块之间应该通过接口来通信,而不理会模块的内部工作原理,它可以使各个模块耦合度降到最低,促进软件的复用。

设计模式类型

五个创建型设计模式

工厂方法模式(含简单工厂,Factory Method Pattern)

抽象工厂模式(Abstract Factory Pattern)

单利模式(Singleton Pattern)

原型模式(Prototype Pattern)

建造者模式(Builder Pattern)

七个结构型设计模式

适配器模式(Adapter Pattern)

桥接模式(Bridge Pattern)

组合模式(Composite Pattern)

装饰模式(Decorator Pattern)

外观模式(Facade Pattern)

享元模式(Flyweight Pattern)

代理模式(Proxy Pattern)

十一个行为模式

责任链模式(Chain of Responsibility Pattern)

命令模式(Command Pattern)

解释器模式(Interpreter Pattern)

迭代器模式(Iterator Pattern)

中介者模式(Mediator Pattern)

备忘录模式(Memento Pattern)

观察者模式(Observer Pattern)

状态模式(State Pattern)

策略模式(Strategy Pattern)

模板方法模式(Template Method Pattern)

访问者模式(Visitor Pattern)

这些模式的学习文章写好后,会把链接赋到名称后面的。这一篇文章也算是作为我设计模式学习的开篇吧,本来想直接写简单工厂模式的,但是后来发现要学设计模式需先把设计模式的来源以及遵循的原则搞清楚,所以就有了这么一个开篇文章,以后添加上了链接也可以作为我学习设计模式的文章的目录。

Java设计模式学习记录-GoF设计模式概述的更多相关文章

  1. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  2. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  3. Java设计模式学习记录-观察者模式

    前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...

  4. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  5. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  6. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  7. Java设计模式学习记录-命令模式

    前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...

  8. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  9. Java设计模式学习记录-外观模式

    前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...

随机推荐

  1. [JAVA]JAVA章4 Thread Dump如何分析

    一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread- ...

  2. HBase总结(十一)hbase Java API 介绍及使用示例

    几个相关类与HBase数据模型之间的对应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...

  3. javaScrpit 开端

    JavaScript 代码可以直接嵌在网页的任何地方,不过我们通常把JavaScrpit放到<head>中: <html> <head> <script> ...

  4. 网站日志流量分析采集(LuaJIT系统环境部署-node03,相关jar包自己手动上传)

    注:/usr/local/src 是源码包路径,可以自己更改 服务器中安装依赖 yum -y install gcc perl pcre-devel openssl openssl-devel 上传 ...

  5. ActiveMQ_2安装

    Linux安装 环境JDK7以上 gz文件拷贝到 /usr/local/目录下 解压 后缀为 .tar.gz的压缩包 进入解压后的文件夹 cd apache-activemq-x.xx.x/ cd b ...

  6. Git+Github入门

    1.安装Git git 返回上一级文件命令 cd ..(cd 和..之间有空格) 2.安装完成后需进一步设置,在命令行输入 3.选择一个合适的地方创建一个空目录 pwd命令用于显示当前目录 4.通过g ...

  7. Oracle存储过程,游标使用

    Oracle存储过程: 语法: CREATE [OR REPLACE] PROCEDURE procedure_name (arg1 [mode1] datatype1,arg2 [mode2] da ...

  8. Django URLConf 进阶

    Django处理一个请求 项目启动后根据 settings  ROOT_URLCONF 决定项目根URLconf urlpatterns是django.conf.urls.url()实例的一个Pyth ...

  9. 【WPF】实现类似QQ聊天消息的界面

    最近公司有个项目,是要求实现类似 QQ 聊天这种功能的. 如下图 这没啥难的,稍微复杂的也就表情的解析而已. 表情在传输过程中的实现参考了新浪微博,采用半角中括号代表表情的方式.例如:“abc[dog ...

  10. SVN 客户端 TortoiseSVN 的安装和使用

    关于 参考博客:TortoiseSVN新人使用指南 TortoiseSVN 是一个 Apache Subversion(SVN)客户端,实现为Windows外壳扩展.它直观且易于使用,因为它不需要Su ...