设计模式面试总结

1.策略模式

定义了算法簇,进行封装,他们之间可以相互替换

实现:接口类来实现算法簇;可以用类的继承或者抽象类的继承来实现个体

2.观察者模式

手动实现:

两个接口 subject:registerObserver(),removeOberver(),notifyOberver()
Oberver:update()
采用  List来保存observer,通过迭代来调用每一个List里面的Observer的update方法

java实现

一个类:Oberverable:addOberver(),deleteObserver(),notifyObervers(),setChanged()

一个接口
Oberver:update()

采用Vector来保存observer,setChanged来通知变化。
  1. Vector & ArrayList
    1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
    2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

  2. Hashtable & HashMap
    Hashtable和HashMap它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。

  3. ArrayList & LinkedList

ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别:
从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能; 而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
http://wiki.jikexueyuan.com/project/java-collection/linkedhashmap.html

反应器模式与观察者模式的异同

反应器模式

是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序。

观察者模式

有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

将事件多路分用、将事件分派到各自相应的事件处理程序。

分布式系统中的服务器应用程序必须处理多个向它们发送服务请求的客户机。然而,在调用特定的服务之前,服务器应用程序必须将每个传入请求多路分用并分派到各自相应的服务提供者。反应器模式正好适用于这一功能。它允许事件驱动应用程序将服务请求多路分用并进行分派,然后,这些服务请求被并发地从一个或多个客户机传送到应用程序。

反应器模式(Reactor pattern)与观察者模式(Observer pattern)在这个方面极为相似:

当一个主体发生改变时,所有依属体都得到通知。

不过

观察者模式与单个事件源关联,而反应器模式则与多个事件源关联。

反应器设计模式(Reactor pattern)是一种为处理服务请求并发 提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序。

装饰者模式

  1. 一个抽象类作为初始类
  2. 一些实际的工具
  3. 装饰类集成自抽象类
  4. 实际的装饰类继承自装饰类

Java 的IO

工厂模式与抽象工厂模式还有简单工厂模式

简单工厂模式:一个类搞定

工厂模式:由子类去决定生产什么(抽象类)
既子类继承工厂,实现创造方法

抽象工厂:定义了一个接口,所有的实际工厂实现此接口。用于创建相关或对象的家族,而不需要制定具体类

单例模式

双重检查
饱汉与饿汉:饱汉getInstance方法创建对象
饿汉:定义为static方法或者放在static块中,在类加载时就初始化了

命令模式

封装命令(接口),由实际命令去实现命令接口,调用者调用命令。

用在队列请求(日程安排、线程池、工作队列)、日志请求

将请求封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。

适配器模式

将一个类的接口,转换成客户期望的另一个接口

旧的枚举迭代器。新的迭代器适配,将旧的适配成新的枚举

外观模式

提供一个统一的接口,用来访问子系统中的一群接口,提供一个高层接口让子系统更容易使用

模板方法模式

在一个方法中定义一个算法的顾家,而将一些步骤延迟到子类中上线。

模板方法在不改变算法结构的情况下,重新定义算法的某些步骤

迭代器模式

java.util.Iterator
提供一种方法顺序访问一个聚合对象中的各个元素

组合模式

将对象组合成树形结构来表现“整体/部分”的层次结构,中间的调用,可以用迭代器来建立

状态模式

允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类。

代理模式

RMI
为另一个对象提供一个替身或者占位符,以控制对这个对象的访问

分为远程代理,和虚拟代理

虚拟代理:一个接口
分别由 被代理者 和 代理者实现

MVC模式

使用了
对象行为类的设计模式,对同步事件分拣和派发。

Dispatcher(分发器),Notifer(通知器)

应用程序提供的每种服务对应一个独立的Event Handler,每种Handler处理一种类型的事件。所有的Event Handler有接口。这样,不同的Event Handler会注册到Initiation Dispacher, Initiation Dispatcher使用Synchronous Event Demultiplexer等待事件的发生。事件发生时,Demultiplexer通知Dispacher,Dispatcher回调Handler,Handler调用对应的事件处理方法。

和观察者模式(Observer)[5]相关,当一个对象改变,其他多个模块被通知。在反应堆模式中,当某个Handle感有兴趣的事件发生,Handler被通知。反应堆模式用来分拣多个事件源的事件,而观察者模式常常只关联一个事件源。
和责任链模式相关(Chain of Responsibility)[5],当把一个请求委托给服务提供者。反应堆模式与责任链不同,反应堆模式关联一个特定的事件处理器到特定的事件源,而责任链模式搜索一个序列去定义第一个匹配的事件处理器。
反应堆模式还被认为是异步Proactor[18]模式的同步变种,Proactor支持异步事件源的事件分拣和多个事件处理器的分派。不同的时,反应堆模式支持的是没有阻塞的同步事件源。
主动对象模式[17]分离了方法的执行和调用,简化了多个线程调用时同步控制的复杂性(这个模式我也翻译过了),。当多线程不可用,或者任务使用多线程太复杂了,反应堆模式经常替换主动对象。
在实现反应堆模式的时候,可以提供一个外观(Facade)[5]类处理事件的分拣。一个外观类用来隐藏一个子系统中复杂的对象关系

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章