全面综述-23-种软件设计模式 (全面综述当前高级财务管理理论发展现状)
在软件行业,设计模式的概念是由四位作者:埃里希·伽马,约翰·弗里赛德斯,拉尔夫约翰逊,理查德·赫尔姆提出的。1994年,他们在《设计模式:可重用面向对象软件的元素》一书中将设计模式应用到编程中。这本书介绍了23种模式,解决了面向对象设计的各种问题,并很快成为畅销书。由于它的名字很长,人们开始称它为四人帮的书,很快就被简称为GoF书。
什么是设计模式
设计模式(DesignPattern)是软件设计中常见问题的典型解决方案。它们就像预先制作的开发蓝图,您可以采用蓝图来解决代码中重复出现的设计问题。但设计模式并不是像使用现成的函数或库那样,可以复制到程序中运行。因为设计模式不是一段特定的代码,也不是语法规范,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案,是解决软件开发中特定问题的一系列套路。
设计模式的分类
设计模式可以分为下面三大类:
- 创建型
- 结构型
- 行为型
创建型
-
FactoryMethod(工厂方法)
- 思路:定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
- 应用场景:当您需要创建一个对象的多个子类时,并且您希望客户端不依赖于这些子类的具体类时。
-
AbstractFactory(抽象工厂)
- 思路:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 应用场景:当您需要创建多个相互依赖的对象家族时,并且您希望客户端不依赖于这些家族的具体类时。
-
Builder(建造者)
- 思路:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 应用场景:当您需要创建一个复杂的对象,并且其构造过程很复杂或需要多个步骤时。
-
Prototype(原型)
- 思路:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
- 应用场景:当您需要创建一个对象,并且其创建过程很昂贵或需要大量计算时。
-
Singleton(单例)
- 思路:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 应用场景:当您需要确保一个类只有一个实例时。
结构型
-
AdapterClass/Object(适配器)
- 思路:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 应用场景:当您需要将一个类的接口适配到另一个接口时。
-
Bridge(桥接)
- 思路:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 应用场景:当您需要将一个抽象类与它的实现类解耦时。
-
Composite(组合)
- 思路:将对象组合成树形结构以表示部分-整体的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
- 应用场景:当您需要表示一个包含其他对象的层次结构时。
-
Decorator(装饰)
- 思路:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
- 应用场景:当您需要动态地给一个对象添加功能时。
-
Facade(外观)
- 思路:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
- 应用场景:当您需要为一个复杂的子系统提供一个简单的接口时。
-
Flyweight(享元)
- 思路:运用共享技术有效地支持大量细粒度的对象。
- 应用场景:当您需要创建大量相似对象时。
-
Proxy(代理)
- 思路:为其他对象提供一种代理以控制对这个对象的访问。
- 应用场景:当您需要控制对另一个对象的访问时。
行为型
-
Interpreter(解释器)
- 思路:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 应用场景:当您需要解释一个特定语言时。
-
TemplateMethod(模板方法)
- 思路:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 应用场景:当您需要定义一个算法的骨架,而允许子类改变其中某些步骤时。
-
ChainofResponsibility(责任链)
- 思路:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
- 应用场景:当您需要将一个请求发送给多个对象,并且您希望这些对象中的一个处理该请求时。
-
Command(命令)
- 思路:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
- 应用场景:当您需要对请求进行参数化、排队、记录或撤消时。
-
Iterator(迭代器)
- 思路:提供一种方法顺序访问一个聚合对象中的元素,而不暴露其底层表示。
- 应用场景:当您需要顺序访问一个聚合对象中的元素时。
总结
设计模式是软件开发中的一个强大工具,它们可以帮助开发人员创建可复用、可维护、可读性高、稳定且安全的代码。通过理解和应用设计模式,开发人员可以提高代码质量并缩短开发时间。
软件设计模式主要有哪几种
软件设计模式主要有以下三大类共23种:
一、创建型模式:
1、工厂方法模式
工厂方法模式的创建是因为简单工厂模式有一个问题,在简单工厂模式中类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改,这违背了开闭原则,所以就出现了工厂方法模式,只需要创建一个工厂接口和多个工厂实现类。
子类可以自己决定实例化哪一个工厂类,client类针对抽象接口进行编程,如果需要增加新的功能,继承工厂接口,直接增加新的工厂类就可以了,创建过程延迟到子类中进行,不需要修改之前的代码,满足了开闭原则,达到灵活地生产多种对象。
2、抽象工厂模式
抽象工厂模式是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。区别于工厂方法模式的地方,工厂方法模式是创建一个工厂,可以实现多种对象;而抽象工厂模式是提供一个抽象工厂接口,里面定义多种工厂,每个工厂可以生产多种对象。
前者的重点在于怎么生产,后者的重点在于生产哪些;前者是一个抽象产品类,可以派生出多个具体产品类,后者是多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
单例模式能保证一个类仅有一个实例,并提供一个访问它的全局访问点,同时在类内部创造单一对象,通过设置权限,使类外部无法再创造对象。单例对象能保证在一个JVM中,该对象只有一个实例存在。
在创建的时候,省去了new操作符,降低了系统内存的使用频率,减轻了系统的压力。同时单例模式保证在一个jvm中仅存在一个实例的好处就在于好比一个军队当中只会存在一个最高级别的军官来指挥整个军队,这样才能保证独立控制整个过程,否则如果出现多个,肯定会杂乱无序。
4、建造者模式
建造者模式是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。在程序当中就是将一些不会变的基本组件,通过builder来进行组合,构建复杂对象,实现分离。
这样做的好处就在于客户端不必知道产品内部组成的细节;同时具体的建造者类之间是相互独立的,对系统的扩展非常有利,满足开闭原则;由于具体的建造者类是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
5、原型模式
原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是将对象复制了一份并返还给调用者,对象需继承Cloneable并重写clone()方法。原型模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。
分为浅复制和深复制,前者是将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的;后者是将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。
二、结构型模式:
1、适配器模式
适配器模式是使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,衔接两个不兼容、独立的接口的功能,使得它们能够一起工作,适配器起到中介的作用。
2、装饰模式
装饰器模式是动态地给一个对象添加一些额外的职责,给一个对象增加一些新的功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。除了动态的增加,也可以动态的撤销,要做到动态的形式,不可以用继承实现,因为继承是静态的。
3、代理模式
代理模式是为其他对象提供一种代理以控制对这个对象的访问,也就是创建类的代理类,间接访问被代理类的过程中,对其功能加以控制。
它和装饰器模式的区别在于,装饰器模式为了增强功能,而代理模式是为了加以控制。代理模式就是多一个代理类出来,替原对象进行一些操作,例如买火车票不一定在火车站买,也可以去代售点。再比如打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作。
4、外观模式
外观模式是为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
在客户端和复杂系统之间再加一层,提供一个容易使用的外观层。外观模式是为了解决类与类之家的依赖关系的,外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,比如搜狐门户网站,就利用了外观模式。
5、桥接模式
桥接模式是将抽象部分与实现部分分离,使它们都可以独立的变化。桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化(突然联想到了mvc模式)。
将抽象化与实现化解耦,使得二者可以独立变化,就好比现在常说的mvc模式,view和model之间通过control来控制,达到高内聚低耦合来解耦的目的。
6、组合模式
组合模式是将对象组合成树形结构以表示部分-整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
创建了一个包含自己对象组的类,并提供修改对象组的方法。在系统的文件和文件夹的问题上就使用了组合模式,文件下不可以有对象,而文件夹下可以有文件对象或者文件夹对象。
7、享元模式
享元模式是运用共享技术有效地支持大量细粒度的对象。享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,重用现有的同类对象,若未找到匹配的对象,则创建新对象,这样可以减少对象的创建,降低系统内存,提高效率。
三、行为型模式:
1、策略模式
策略模式是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换,且算法的变化不会影响到使用算法的客户。
为了统一接口下的一系列算法类(也就是多种策略),用一个类将其封装起来,使这些策略可动态切换。策略模式属于行为型模式,是为了使这些策略可以相互切换,是为了选择不同的行为。
2、模版方法模式
模板方法模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。该模式就是在一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,将一些固定步骤、固定逻辑的方法封装成模板方法。调用模板方法即可完成那些特定的步骤。
3、观察者模式
观察者模式是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
也就是当被观察者状态变化时,通知所有观察者,这种依赖方式具有双向性,在QQ邮箱中的邮件订阅和RSS订阅,当用户浏览一些博客时,经常会看到RSS图标,简单来说就是当订阅了该文章,如果后续有更新,会及时通知用户。这种现象即是典型的观察者模式。
4、迭代器模式
迭代器模式是提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。
在Java当中,将聚合类中遍历各个元素的行为分离出来,封装成迭代器,让迭代器来处理遍历的任务;使简化聚合类,同时又不暴露聚合类的内部,在我们经常使用的JDK中各个类也都是这些基本的东西。
5、责任链模式
责任链模式是避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。
但是发出者并不清楚到底最终那个对象会处理该请求。在生活中学生进行请假的过程中,会涉及到,学生请假会一级一级往上批,最终处理,具体由谁批准可能不清楚。在程序当中,现在使用的struts拦截器即用到了责任链模式。
6、命令模式
命令模式是将一个请求封装成一个对象,从而使发出者可以用不同的请求对客户进行参数化。模式当中存在调用者、接收者、命令三个对象,实现请求和执行分开;调用者选择命令发布,命令指定接收者。
7、备忘录模式
备忘录模式是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。创建一个备忘录类,用来存储原始类的信息;同时创建备忘录仓库类,用来存储备忘录类,主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,也就是做个备份。
在系统当中使用的撤销操作,即是使用了备忘录模式,系统可以保存有限次数的文件状态,用户可以进行上几个状态的恢复,也就是用到了备忘录模式。
8、状态模式
状态模式是允许对象在内部状态发生改变时改变它的行为。对象具有多种状态,且每种状态具有特定的行为。
在网站的积分系统中,用户具有不同的积分,也就对应了不同的状态;还有QQ的用户状态有几种状态,在线、隐身、忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态。
9、访问者模式
访问者模式主要是将数据结构与数据操作分离。在被访问的类里面加一个对外提供接待访问者的接口,访问者封装了对被访问者结构的一些杂乱操作,解耦结构与算法,同时具有优秀的扩展性。通俗来讲就是一种分离对象数据结构与行为的方法。
通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。
10、中介者模式
中介者模式是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
例如,MVC模式中control就是model和view的中介者。与适配器区别在于,适配器是为了兼容不同的接口,而中介者是为了将显示和操作分离。
11、解释器模式
解释器模式是给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子,基本也就用在这个范围内,适用面较窄,例如:正则表达式的解释等。
参考资料来源:
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。
创建型模式关注对象的创建过程。
2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
结构型模式关注对象和类的组织。
4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
行为型模式关注系统中对象之间的相互交互,研究系统在运行时对象之间相互通信和协作,进一步明确对象的职责,共有11种模式。
23种设计模式是哪23种?
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。