四.设计模式中的行为型模式
1.模版方法模式:
功能:
在不改变模板结构的前提下在子类中重新定义模板中的内容。
优点:
提高代码复用性,拓展性,将相同部分的代码放在抽象的父类中,将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为.
缺点:
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
2.策略模式:
功能:
定义一组算法,将每个算法都封装起来,并且使他们之间可以互换
优点:
每个算法单独封装,减少了算法和算法调用者的耦合,合理使用继承有助于提取出算法中的公共部分。
缺点:
策略模式只适用于客户端知道所有的算法或行为的情况。容易创建很多策略类,导致系统实现的复杂度增加
3.状态模式:
功能:
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类
优点:
将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为.可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数.
缺点:
违反了开放封闭原则,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码.
4.命令模式:
功能:
将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作.
优点:
降低了系统耦合度,新的命令可以很容易添加到系统中去.
缺点:
使用命令模式可能会导致某些系统有过多的具体命令类.
5.迭代器模式:
功能:
提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示.
优点:
在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码.并且其简化了聚合类.支持多种方式进行遍历.
缺点:
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
6.备忘录模式:
功能:
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
优点:
给用户提供了一种可以恢复状态的机制。可以是用户能够比较方便地回到某个历史的状态.实现了信息的封装。使得用户不需要关心状态的保存细节
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
7.观察者模式:
功能:
一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现.
优点:
当两个对象之间送耦合,他们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间送耦合。主题所知道只是一个具体的观察者列表,每一个具体观察者都符合一个抽象观察者的接口。主题并不认识任何一个具体的观察者,它只知道他们都有一个共同的接口.
缺点:
如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间.如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进 行循环调用,可能导致系统崩溃.
8.中介者模式:
功能:
所谓中介者模式就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
优点:
简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使系统成为松耦合系统。
缺点:
由于中介者对象封装了系统中对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。
9.访问者模式:
功能:
访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
优点:
将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。
缺点:
增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求。
10.责任链模式:
功能:
避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止
优点:
增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
缺点:
系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用,并且不能保证一定会被得到接收.
11.解释器模式:
功能:
所谓解释器模式就是定义语言的文法,并且建立一个解释器来解释该语言中的句子。
优点:
可扩展性比较好,灵活,增加了新的解释表达式的方式。
缺点:
执行效率比较低,可利用场景比较少, 对于复杂的文法比较难维护。
五.小结:
文章中的总结大部分都来源于 "大话设计模式" 这本书,书中讲解的知识风趣幽默,作者通过小菜和大鸟的对话来引入设计模式,确实是这样,计算机来源于生活,模仿着生活,它将一些简单的事情复杂化,但同时它也将我们生活中更多的东西普遍化,自动化,设计模式这个知识点也许有些人以为已经过时,认为java中一些轻量级的框架可以满足我们工作时候大部分的所需,但是我认为无论是否已经过时,是否以后不是为了去学习架构的知识也好,设计模式中的思想是非常值得我们借鉴的,列如一些简单开发的时候我们可以考虑有更多的方法来做这件事一样,我们要摆脱一个简单的思维模式,我们要像设计师一样去思考问题.未来的路还非常遥远,但是学习的步伐会始终陪伴着我们一起去踏遍这未来还未见的路途.