再看23种设计模式
首先什么是设计模式呢?设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解、保证代码的可靠性。由此我们可以看到,其和构架还是有一点相似之处的吗?因为架构就是特定领域基于体系结构的可重用的设计嘛。好吧,再次复习一下设计模式还是蛮有必要的呢。
一、简单工厂模式:
将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。 在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何Java源代码。
简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
二、工厂方法模式:
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了“开闭原则”。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
三、抽象工厂模式:
当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。
四、建造者模式:
建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。建造者模式的结构中还引入了一个指挥者类Director,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。
五、原型模式:
原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。一个类包含一些成员对象,在使用原型模式克隆对象时,根据其成员对象是否也克隆,原型模式可以分为两种形式:深克隆和浅克隆。
六、单例模式:
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
单例模式的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式包含的角色只有一个,就是单例类——Singleton。单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化它。除此之外,该模式中包含一个静态私有成员变量与静态公有的工厂方法,该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
七、适配器模式:
适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。
八、桥接模式:
桥接模式主要是抽象化与实现化的脱藕:
·抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。
·实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。
九、组合模式:
组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。
同时容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构。
十、装饰模式:
使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。
十一、外观模式
用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。
十二、享元模式
享元模式是一个为了提高系统的性能的设计模式,在系统运行的过程中,有许多对象都是类似的,他们在被应用的时候状态很小,因此我们可以建立一个享元类保存这个重用率很高的类,当用户需要时首先从享元类中检查一下有没有所需要的类,如果有的话,就不需要重新创建了,就是通过这样的方法来提高系统的效率。
十三、代理模式
代理模式,类似于我们买房时候的房屋代理,有的时候我们不能我们想要访问的对象(如房主)进行直接的沟通,这时候我们就需要一个代理,代理模式就是解决这样问题的一个模式,像spring中AOP就是典型的代理模式,代理模式,使我们通过代理间接的访问一个对象,对其进行操作。
最后是行为模式的内容,行为模式不仅关注类和对象的结构,重点关注他们之间的相互作用。
十四、 职责链模式
职责链模式的目的主要是避免请求发送者与接收者耦合在一起,让多个对象都有可能接收到请求,将这些对象链成一条链,并沿着这条链传递请求。职责链模式由每一个对象对其下家的引用连成一条链。例如我们的请假条,首先交给辅导员处理,辅导员处理不了,交给系主任处理,系主任处理不了交给院长,就是这么一层层的形成一条链。
十五、命令模式
命令模式主要是解决那种我们需要向系统中的某些对象发送请求,但却不知道请求的接收者具体是谁,也不知道被请求的操作具体是哪个,我们只需在程序具体运行时指定具体的请求接收者即可。比如电视遥控器的操作,我们并不知道,具体执行开机、关机、换频道的具体对象是哪个,但是我们只需用遥控器发送相关的命令即可。
十六、解释器模式
如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题实例表述成为一个语言中的句子,因此可以构成一个解释器,改解释器通过这些句子来解释这些问题。这一模式主要应用于面向对象语言开发的编译器中。
十七、迭代器模式
迭代器模式主要是提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。比如像java中的集合类,我们就可以通过迭代器模式进行遍历,但又不需要去了解其内部结构。
十八、 中介者模式
通过一个对象来封装一系列的对象交互,中介者使用对象不需要显示地相互引用,可以降低耦合性,使他们可以独立的改变他们之间的交互。这个模式就像我们的qq群一样,有了qq群,我们想和多个人聊天,就不用一个个的和他们进行聊天,只要通过群就可以实现多人同时进行聊天。
十九、备忘录模式
备忘录模式,我们对软件进行操作的时候,难免会犯一些错误,这时我们就需要利用我们的备忘录模式来保存每一次系统操作的状态,一旦我们进行错误的操作,我们把之前的状态取出就可以回到以前的状态。
二十、 观察者模式
观察者模式,定义了对象之间的一种一对多依赖关系,它使得当每一个对象状态发生改变时,其相关依赖对象皆得到通知并且自动更新。他的原理就像股票和股民一样,当股票上涨时,股民就会兴奋;当股票下跌时,股民就会伤心失望。
二十一、状态模式
很多情况下,一个对象的行为取决于一个或者多个动态变化的属性,这样的属性就叫做状态,而往往当对象的状态改变时,他的行为也会发生相应的变化,如当一个人开心时,他就可能唱歌、请客吃饭;伤心时,就可能自己一个人默默的悲伤,这就是状态的改变引起行为上的变化,而状态模式正是用来描述这样行为的模式。
二十二、 策略模式
在多数情况下,我们实现某个目标的途径不止一条,例如人们外出旅行的出行方式。我们可以根据自己能承受的经济限度,选择不同的出行方法。而策略模式正是将解决问题的不同方法封装起来,使他们可以相互替换,而具体选择哪个就需要根据实际情况具体而定了。
二十三、模板方法模式
在生活中,我们可能都经历过这种情况,比如请客吃饭,我们都会经历点菜,吃东西和买单几个步骤,而到底吃什么则由用户自己决定。模板方法模式就是描述这样一种情况的模式,它先将算法的骨架写出来,而将一些用户要决定的事情推迟到子类中决定。
二十四、 访问者模式
访问者模式,表示一个作用于某对象结构中的各元素的操作,它是我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。比如对于购物车中的水果和图书,收银员的操作是计算价格,进行收款,而顾客的操作则是进行付款。