23种设计模式

关于23种设计模式的理解

         今天来全面复习一下软件设计模式的相关知识,经过复习这些过去学过的知识,来更好的理解咱们要学的软件架构方面的知识。java

         首先咱们先了解一下模式这个词吧,模式最先起源于建筑业,它的定义包含三个方面:Context(模式适用的前提条件)、Problem(在特定条件下须要解决的目标问题)、Solution(对目标问题各类关系的描述)。最后总结出的定义:模式是在特定环境中解决问题的一种方案。模式描述了解决问题的核心,经过这种方式,咱们无需再作一样的工做,只需根据模式去复用他们,就能够完成相应的任务。算法

         那么软件设计模式又是什么呢?软件设计模式被反复使用、多数人知晓的、通过分类编目的、代码设计经验的总结,使用软件设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可靠性。而咱们根据其目的又能够将软件分为:建立型、结构型和行为型三种。spring

那么咱们首先看一下建立型的各类设计模式。数据库

  简单工厂模式设计模式

 

 

         咱们能够看到简单工厂模式是建立了一个抽象的产品类,而后你须要具体建立什么产品,只须要在静态的工厂方法类中传递正确的参数,咱们工厂类就能根据相应的参数创造出正确的产品,采用简单工厂方法的模式,咱们没必要再判断出要建立什么类型的产品后,写一大堆的代码,而是只要new出相应的产品便可,下降了系统的耦合性,使工厂方法和产品方法的修改都变得更加容易。架构

 

  工厂方法模式性能

 

 

咱们能够看到工厂方法模式是对简单工厂方法模式的一种完善,在简单工厂方法模式中,若是有新的产品须要加入系统中时,就必需要编写相应的逻辑方法,而这违背了设计模式中的“开闭原则”,而工厂方法模式正解决了这一问题,它将工厂类抽象出来,当须要建立产品时,去交给他的子工厂类去建立,这样当须要建立新产品时,只须要建立一个新的产品类和子工厂类就好,知足了开闭原则。网站

 

  抽象工厂模式设计

 

 

抽象工厂模式是为了处理工厂所须要生产的产品并非一个简单的对象,而是处理生产多个位于不一样产品等级结构中属于不一样类型的具体产品。好比生产电视机和空调,而电视机和空调又能够分为Hair和TCL的,相同品牌的电器被称为产品族,相同类型的电器为产品等级结构,他必须把不一样品牌的电器,创造出不一样的工厂来建立相应的产品。代理

 

  建造者模式

 

 

 

在咱们的现实生活中,咱们常常要建造一个复杂的对象,相似于汽车,咱们客户并不关心其中有什么组件和他们的装配细节,而关心的一辆完整的汽车,而在咱们的软件中有时也有一些复杂的对象,咱们不须要知道里面构建的细节,只须要返回一个完整的对象便可,这时就须要建造者模式。

 

  原型模式

 

 

 

原形模式就是根据一个对象,来复制出多个与原来对象如出一辙的对象,其中根据其成员对象是否也克隆分为深克隆和浅克隆。

 

  单例模式

 

 

 

单例模式是为了确保某一个类中只有一个实例,而且这个类会自行实例化这个实例,而且向整个系统提供这个实例。单例模式用处挺大的,像j2ee中那些链接数据库的操做,很是占用内存,若是常常开启新的实例来链接的话,那么系统会吃不消,这时候单例模式就是一个不错的选择了。

 

 

接下来是结构型的设计模式,结构型设计模式关注的是经过关联关系使得一个类中去定义另外一个类的实例对象

  适配器模式

 

 

适配器就像咱们的电脑充电器,能够经过它使咱们的电脑充上电。适配器模式能够理解为经过一个接口使接口不兼容的那些类能够同时工做,好比咱们能够经过一个转化接口使机器人类能够模仿人的行为。

 

  桥接模式

 

 

 

就是使抽象和实现分开,使他们能够各自独立的发生变化,好比画笔的大小和颜色,若是咱们简单的将他们组合去一个个实例化,那就太复杂了,若是采用桥接模式的话,咱们只需将抽象类中的相应的实现取出来就行了。

 

 

  组合模式

 

 

组合模式就是将多个对象以树形结构表示出来,其中容器对象类和容器之间有一个聚合关联关系,经过这个关联,可使容器对象包含叶子,也能够包含容器对象,以此实现递归组合,造成一个树形结构。典型的表明就是文件夹和文件的关系。

 

  装饰模式

 

 

 

装饰模式,就如其名字,其目的就是为了动态的给一个对象增长一些额外的职责,就像给一个照片加上不一样类型的相框同样,装饰模式是在一个已有的构件类上进行相应的装饰,好比变形金刚的例子,刚开始是一辆汽车,进行装饰以后能够变成机器人。

 

 

  外观模式

 

 

 

外观模式,就像网站的首页同样,一个网站包含许多子模块,若是一个用户每次想进入相应的子模块,都要本身输入相应子模块的地址,那就太麻烦了,而首页就很好的解决了这一问题,用户只需记住一个首页的网址,而后在进行选择就行了。这就是外观模式,经过一组接口来为子系统提供一个一致性的界面,这个接口使子系统更加容易使用。

 

 

  享元模式

 

 

 

享元模式是一个为了提升系统的性能的设计模式,在系统运行的过程当中,有许多对象都是相似的,他们在被应用的时候状态很小,所以咱们能够创建一个享元类保存这个重用率很高的类,当用户须要时首先从享元类中检查一下有没有所须要的类,若是有的话,就不须要从新建立了,就是经过这样的方法来提升系统的效率。

 

 

  代理模式

 

 

 

代理模式,相似于咱们买房时候的房屋代理,有的时候咱们不能咱们想要访问的对象(如房主)进行直接的沟通,这时候咱们就须要一个代理,代理模式就是解决这样问题的一个模式,像spring中AOP就是典型的代理模式,代理模式,使咱们经过代理间接的访问一个对象,对其进行操做。

 

最后是行为模式的内容,行为模式不只关注类和对象的结构,重点关注他们之间的相互做用。

 

  职责链模式

 

 

 

         职责链模式的目的主要是避免请求发送者与接收者耦合在一块儿,让多个对象都有可能接收到请求,将这些对象链成一条链,并沿着这条链传递请求。职责链模式由每个对象对其下家的引用连成一条链。例如咱们的请假条,首先交给辅导员处理,辅导员处理不了,交给系主任处理,系主任处理不了交给院长,就是这么一层层的造成一条链。

 

  命令模式

 

 

命令模式主要是解决那种咱们须要向系统中的某些对象发送请求,但殊不知道请求的接收者具体是谁,也不知道被请求的操做具体是哪一个,咱们只需在程序具体运行时指定具体的请求接收者便可。好比电视遥控器的操做,咱们并不知道,具体执行开机、关机、换频道的具体对象是哪一个,可是咱们只需用遥控器发送相关的命令便可。

 

 

  解释器模式

 

 

 

若是在系统中某一特定类型的问题发生的频率很高,此时能够考虑将这些问题实例表述成为一个语言中的句子,所以能够构成一个解释器,改解释器经过这些句子来解释这些问题。这一模式主要应用于面向对象语言开发的编译器中。

 

  迭代器模式

 

 

 

 

迭代器模式主要是提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。好比像java中的集合类,咱们就能够经过迭代器模式进行遍历,但又不须要去了解其内部结构。

 

  中介者模式

 

 

经过一个对象来封装一系列的对象交互,中介者使用对象不须要显示地相互引用,能够下降耦合性,使他们能够独立的改变他们之间的交互。这个模式就像咱们的qq群同样,有了qq群,咱们想和多我的聊天,就不用一个个的和他们进行聊天,只要经过群就能够实现多人同时进行聊天。

 

  备忘录模式

 

 

 

备忘录模式,咱们对软件进行操做的时候,不免会犯一些错误,这时咱们就须要利用咱们的备忘录模式来保存每一次系统操做的状态,一旦咱们进行错误的操做,咱们把以前的状态取出就能够回到之前的状态。

 

  观察者模式

 

 

观察者模式,定义了对象之间的一种一对多依赖关系,它使得当每个对象状态发生改变时,其相关依赖对象皆获得通知而且自动更新。他的原理就像股票和股民同样,当股票上涨时,股民就会兴奋;当股票下跌时,股民就会伤心失望。

 

  状态模式

 

 

 

不少状况下,一个对象的行为取决于一个或者多个动态变化的属性,这样的属性就叫作状态,而每每当对象的状态改变时,他的行为也会发生相应的变化,如当一我的开心时,他就可能唱歌、请客吃饭;伤心时,就可能本身一我的默默的悲伤,这就是状态的改变引发行为上的变化,而状态模式正是用来描述这样行为的模式。

 

  策略模式

 

 

在多数状况下,咱们实现某个目标的途径不止一条,例如人们外出旅行的出行方式。咱们能够根据本身能承受的经济限度,选择不一样的出行方法。而策略模式正是将解决问题的不一样方法封装起来,使他们能够相互替换,而具体选择哪一个就须要根据实际状况具体而定了。

 

  模板方法模式

 

 

 

在生活中,咱们可能都经历过这种状况,好比请客吃饭,咱们都会经历点菜,吃东西和买单几个步骤,而到底吃什么则由用户本身决定。模板方法模式就是描述这样一种状况的模式,它先将算法的骨架写出来,而将一些用户要决定的事情推迟到子类中决定。

 

  访问者模式

 

 

 

访问者模式,表示一个做用于某对象结构中的各元素的操做,它是咱们能够在不改变各元素的类的前提下定义做用于这些元素的新操做。好比对于购物车中的水果和图书,收银员的操做是计算价格,进行收款,而顾客的操做则是进行付款。