设计模式读书笔记(Java实现)
凉茶方便面
学习
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
设计模式——综述
设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已正式的技术表达成设计模式会使新系统开发者更加容易理解其设计思路。常用的设计模式有23种,包括5种创建型模式、7种结构型模式、11种行为模式。其中创建型模式包括抽象工厂、生成器、工厂方法、原型、单例模式;结构性模式包括,适配器、桥接、组合、装饰器、外观、享元、代理;行为模式包括,职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者。原创 2016-07-29 19:14:10 · 1116 阅读 · 0 评论 -
十四、命令模式Command(行为型)
将一个请求封装为一个对象,从而使你可以实现用不同请求对客户进行参数化、对请求进行排队或记录请求日志,以及支持可撤销的操作。有时必须向某对象提交请求,但是当前对象并不知道关于被请求的操作或请求的接受者的任何信息。命令模式通过将请求本身变成一个对象向未指定的应用对象提出请求,这个对象可被存储并像其他的对象一样被传递。原创 2016-07-29 19:29:18 · 350 阅读 · 0 评论 -
十五、解释器模式Interpreter(行为型)
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过这些句子来解决该问题。例如正则表达式就是一种描述字符串模式的一种标准语言。解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。在解释器模式中,会使用类来表示一条文法规则。原创 2016-07-29 19:30:14 · 357 阅读 · 0 评论 -
十六、迭代器模式Iterator(行为型)
提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。迭代器模式的关键思想是将对聚集对象的访问和遍历从队列对象中分离出来,并放入一个迭代器对象中,迭代器类定义了一个访问该聚集对象的接口。另外,迭代器和聚集对象是聚合在一起的,而且客户对象必须知道遍历的是哪个具体的聚集对象,以及它的结构是什么,这可以通过多态来实现。使用迭代器模式时分为两种迭代形式:外部迭代,由客户来控制迭代;内部迭代,由迭代器控制迭代。使用外部迭代是比较灵活的,但是需要外部客户主动控制迭代的过程。原创 2016-07-29 19:31:21 · 519 阅读 · 0 评论 -
十七、中介者模式Mediator(行为型)
中介对象可以封装一系列的对象交互,它可以使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在进行面向对象设计时,一般倾向于将系统分割成许多对象,这样可以增加复用性,但是这样做会导致对象的关系会非常复杂。中介者可以将这些集体行为封装起来,充当控制和协调这组对象交互的角色,从而使得这些对象之间不再有显式的相互引用,它们只知道中介者,从而减少了相互连接的数目。原创 2016-07-29 19:31:52 · 454 阅读 · 0 评论 -
十八、备忘录模式Memento(行为型)
在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原来保存的状态。为了允许用户取消不确定的操作,或从错误中恢复过来,需要实现检查点和取消机制,而要实现这些机制,你必须事先将状态信息保存在某处,这样才能将对象恢复到它们先前的状态。原创 2016-07-29 19:33:42 · 348 阅读 · 0 评论 -
十九、观察者模式Observer(行为型)
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知,并被自动更新。将一个系统分割成一系列相互协作的类有一种常见的副作用,需要维护相关对象间的一致性,我们不希望为了维护一致性而使各种类紧密耦合,这样会降低它们的可重用性。观察者模式可以描述一个对象改变时,与之相关的对象状态也可以被动更新。在观察者模式中,一个Observer可以订阅任意数量的Subject,一旦Subject的状态发生改变的时候,所有的观察者都会得到通知。原创 2016-07-29 19:34:29 · 612 阅读 · 0 评论 -
二十、状态模式State(行为型)
允许一个对象在其内部状态改变时改变它的行为,这种改变看起来似乎是修改了它的类本身。就像进行TCP连接时,TCP连接的状态都会经过一系列的变化,当从一个状态变为另一个状态时,它的功能就可能发生变化。原创 2016-07-30 22:00:41 · 402 阅读 · 0 评论 -
二十一、策略模式Strategy(行为型)
定义了一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式使得算法独立于它的Client的变化而变化。策略模式可以帮助我们处理,当我们需要在不同的情况下使用不同的算法时的情况。策略模式适用于,许多类只有行为存在差异,或者需要使用一个算法的不同变体时。但是策略模式也有一些缺点,比如,Client必须了解不同的策略之前的差别,容易造成Context和Strategy之间的耦合,增加了对象的数量等。原创 2016-07-30 22:01:30 · 386 阅读 · 0 评论 -
二十二、模板方法模式Template Method(行为型)
定义一个算法的骨架,将其中的某些步骤的实现延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法可以使用一些抽象的操作定义一个算法,而子类重定义这些操作以提供具体的行为。通过使用抽象操作定义算法中的某些步骤,模板方法确定了它们的先后顺序,子类再实现这些抽象方法,这样一个完整的算法就完成了。模板方法适用于,算法中具有某些不变部分,并可以将不变的行为交给子类来实现,或者是子类中的公共行为可以被提取到公共父类中,以避免代码重复。原创 2016-07-30 22:02:31 · 417 阅读 · 0 评论 -
二十三、访问者模式Visitor(行为型)
表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。使用访问者模式时,我们可以将每个类中的相关操作包装在一个独立的对象中,并在使用时将对象传递给当前访问的元素,当一个元素“接受”该访问者时,该元素向访问者发送一个包含自身类信息的请求,该请求同时也将该元素本身作为一个参数,然后访问者将为该元素执行该操作。一般情况下,Visitor模式需要定义两个类层次:一个对应于接受操作的元素,另一个应用于定义对元素的操作的访问者。当需要增加新的操作时,只需要添加新的原创 2016-07-30 22:03:15 · 681 阅读 · 0 评论 -
十三、职责链模式Chain of Responsibility(行为型)
责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者,提交请求的对象并不明确的知道哪一个对象将会处理它,我们说这个请求有一个隐式接收者。原创 2016-07-29 19:28:25 · 349 阅读 · 0 评论 -
十二、代理Proxy(结构型)
代理模式为其他对象提供一种代理以控制对这个对象的访问。使用代理模式常见的原因是希望只有在我们确实需要对象时才对它进行创建和初始化。但是随着AOP技术的发展,代理技术也被用于运行时为对象添加新的特性或者进行全局的特性设置,如为某些特定命名或指定的类方法提供事务处理,为系统的所有类添加日志管理等批量功能,或者使用Java的RMI实现分布式功能。原创 2016-07-29 19:27:42 · 414 阅读 · 0 评论 -
一、工厂方法Factory Method(创建型)
定义一个用于创建对象的接口,让子类决定实例化哪个类。Factory Method使一个类的实例化延迟到其子类。1.标准做法——使用继承抽象类的方式,在子类中实现抽象工厂2.参数化工厂方法——为工厂方法提供参数构建产品3.使用独立的工厂类4.独立工厂类中使用多个工厂方法5.独立工厂类中使用静态工厂方法6.Java中特殊的方式(使用类名的字符串)7.Java中特殊的方式(使用泛型参数)原创 2016-07-29 19:14:50 · 532 阅读 · 0 评论 -
二、抽象工厂模式Abstract Factory(创建型)
抽象工厂可以创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂需要产生一个和产品相同的继承结构,从而产生出可以生产各种产品的工厂,在使用时,我们可以将不同的工厂注入Client,从而产生不同的产品。原创 2016-07-29 19:18:59 · 434 阅读 · 0 评论 -
三、生成器模式Builder(创建型)
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它的思路大概是这样的:整个构建过程分为两个部分,首先依靠Director对象进行指导创建,这里的指导主要是创建操作的各种顺序,然后具体的构建却是由Builder来进行的。另外Builder一般会设计成为接口,这样就可以实现不同的Builder给Director使用,Director就可以给Client生成不同的对象了。原创 2016-07-29 19:20:28 · 443 阅读 · 0 评论 -
四、原型模式Prototype(创建型)
用原型对象创建对象的种类,并通过拷贝这些原型创建新的对象。在原型设计模式中,这些新建的对象会非常多,它们最大的区别在于初始化时会有所不同,而且还可以被分为若干类。原创 2016-07-29 19:22:18 · 619 阅读 · 0 评论 -
六、适配器模式Adapter(结构型)
适配器模式将一个类转换成客户希望的另外一个接口,它使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。在Java中只支持单继承,故Java中实现Adapter模式时常用对象组合来实现,而在C++中可以使用多重继承来实现。原创 2016-07-29 19:24:19 · 616 阅读 · 0 评论 -
七、桥接模式Bridge(结构型)
将抽象部分与它的实现部分分离,使它们都可以独立地变化。通常来说,当一个抽象有多个实现时,用继承来协调它们,但是继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。但是使用桥接模式可以将抽象和它的实现部分分离开,并且可以通过生成子类的方式扩充实现,当修改相应的实现时,对客户代码不会产生任何影响。原创 2016-07-29 19:24:48 · 418 阅读 · 0 评论 -
八、组合模式Composite(结构型)
将对象组合成树形结构以表示“部分-整体”的层次结构,Composite模式使得用户对单个对象和组合对象的使用具有一致性。例如,在office中绘图,可以将若干图形组合成为组,当对组操作时会影响所有的组内元素,这里就是把组合图形作为单个元素来看待。使用Composite模式时可以表示对象的部分-整体层次结构,可以让你忽略组合对象和单个对象的不同,它还可以简化客户代码,使得更容易增加新类型的组件,原创 2016-07-29 19:25:15 · 538 阅读 · 0 评论 -
九、装饰器模式Decorator(结构型)
装饰器模式可以动态地给一个对象添加一些额外的职责。就添加功能来说,既可以通过生成子类的方式添加,也可以使用装饰器模式添加,但是使用装饰器模式时更加灵活。通过装饰器模式,可以将组件嵌入另外一个对象,然后使用这个对象增强原对象的功能,从而达到装饰的目的。原创 2016-07-29 19:25:38 · 466 阅读 · 0 评论 -
十、外观模式Facade(结构型)
Facade可以为子系统中的一组接口提供一个一致的界面,它定义了一个高层接口,这个接口使得子系统更加容易使用。这种模式相当于模块化设计时,一个复杂的子系统向外提供简单的系统调用接口从而达到简化系统的目的。客户程序将所有的请求发送给Facade,并在Facade的协助下与子系统通讯,故使用Facade时,客户程序不需要直接访问子系统对象。原创 2016-07-29 19:26:27 · 597 阅读 · 0 评论 -
十一、享元Flyweight(结构型)
享元模式可以帮助你运用共享技术有效的支持大量细粒度的对象。Flyweight是一个共享对象,它可以同时在多个场景中使用,并且在每个场景中flyweight都可以作为一个独立的对象——这点和非共享对象的实例没有区别。例如,在文本编辑器中,所有的字符都会在开始时初始化,并在全局内共享所有字符,而不是每个字符就创建对象。原创 2016-07-29 19:27:19 · 629 阅读 · 0 评论 -
五、单例模式Singleton(创建型)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。例如在全局只有一个工厂,这个工厂可以生产你注册进去的任意组件,那么这个工厂就适合使用单例模式来创建。1.常用单例方式2.可以进行注册的单例3.使用synchronized同步的单例(线程安全)4.使用static域的单例(线程安全)5.使用内部类创建(线程安全)6.强烈不建议用的方式(双重检查加锁DCL、非多线程安全)原创 2016-07-29 19:23:28 · 909 阅读 · 0 评论
分享