第二十章 迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
第二十一章 单例模式singleton
保证一个类仅有一个实例,并提供一个访问他的全局访问点。
实现方式:将构造方法私有化,并提供一个公有的访问实例的方法,实例保存在类中。
懒汉模式与饿汉模式
区别在于是否在初始化类的时候就创建实例,懒汉等到类被调用才创建实例,而饿汉类被加载后就已经创建实例了。
懒汉模式需要考虑线程安全问题,需要使用双重锁定。
饿汉模式由于是初始化就加载好了,不需要考虑线程安全,但是对象的属性如果要修改会存在问题。对象是final的,他的属性也是final的,java基本类型的属性不能修改,对象类型的属性引用地址不能修改内容可以改多线程修改容易产生歧义。
第二十二章 桥接模式
将抽象部分与它的实现部分分离,使他们都可以独立的变化。
对象的继承关系在编译时就定义好了,所以无法在运行时改变从父类继承的实现。父类的变化必然会导致子类发生变化。这种依赖限制了灵活性,从而导致类不易复用。
合成/聚合复用原则,尽量使用合成/聚合,不要使用类继承。
类中保存接口的实现类,从而实现松耦合。
第二十三章 命令模式
将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。
优点:
- 容易设计一个命令队列
- 便于将命令记录到日志中
- 运行接受请求的一方否决请求
- 便于撤销或重做请求
- 新加入具体命令类不影响其他类
敏捷开发原则,不要为代码添加基于猜测的、实际不需要的功能。
第二十四章 职责链模式
使得多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递请求直至有对象处理请求为止。
优点:
- 使得接受者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。对象只需记录后继者即可,不需要记录全链对象。
- 便于随时添加或修改请求结构。
注意:要当心一个请求直到链的末端还是得不到处理,或者因为没有正确的配置而得不到处理。
第二十五章 中介者模式
用一个中介对象来封装一系列的对象交互。中介者使得各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式减少了各个对象之间的耦合,可以方便的增删改。交互的复杂性降低,中介者类的复杂性上升,这个类会很复杂。优点在于集中控制,缺点也是这个。
第二十六章 享元模式 flyweight
运用共享技术有效地支持大量细粒度的对象。
将大量相同的类移到类实例的外部,在方法调用时将他们传递进来,通过共享大幅度地减少单个实例的数目。
应用场景
- 如果一个应用程序使用了大量的对象,且大量的对象造成了很大的存储开销。
- 对象的大多数状态可以放在外部,如果删除对象的外部状态,那么可以用相对较少的共享状态取代很多组对象。
第二十七章 解释器模式interpreter
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。
当有一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
用了解释器模式可以容易地改变和扩展文法,通过继承来改变或扩展。但是不足之处在于解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器处理。
第二十八章 访问者模式visitor
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访客模式适用于数据结构相对稳定的系统,目的是把处理从数据结构中分离出来。
如果数据结构较稳定,且算法易变,访问者模式比较适用因为便于增加算法。缺点是增加新的数据结构很困难。