您的位置:首页 > 其它

一些常用设计模式的应用场景

2013-12-26 12:39 711 查看
创建型模式

构建者(builder)

当创建一个类的过程比较复杂时(例如要组合对象、以及判断构造参数是否足够和合法),用专门的类(如建立一个专门的Builder类)和方法将这个创建的过程封装起来。

工厂方法(Factory Method)

给方法传入类的名称,方法给你返回你想要的类实例,现在这个模式的功能被spring框架IOC取代

抽象工厂(Abstract Factory)

抽象工厂模式与工厂方法模式的区别

可以这么说,工厂方法模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂方法模式的一种推广。

(1)、其实工厂方法模式是用来创建一个产品的等级结构的,而抽象工厂模式是用来创建多个产品的等级结构的。工厂方法创建一般只有一个方法,创建一种产品。抽象工厂一般有多个方法,创建一系列产品。

(2)、工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

简而言之->

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

典型应用:GUI工具箱,点击工具箱中的每种工具类型时,使用不同的工厂类,在编辑界面上创建对应的组件对象

职责型模式

观察者(observer)

当对象的状态变化时,需要通知其他对象。使用observer模式,可以使解除通知的依赖关系,发生变化的类不需依赖接收通知的类。借用jdon的一个例子:产品价格和名称发生变化时,需要通知到相关的用户和商家,可以分别定义两个observer类,在producet中包含一个observerList列表,在setName和setPrice方法中分别调用notifyObservers方法。Java的API还为为我们提供现成的Observer接口Java.util.Observer.我们只要直接使用它就可以.



职责链模式(chain of Responsibility)

接收GUI响应后(例如按帮助按钮后),响应代码的处理,可以自己处理,也可以将响应传到下一个处理者。

java中的异常响应机制也是中这种模式,可以捕捉异常,或者将异常抛出到外面一层。

代理模式(Proxy)

处理跟外部系统或硬件交互时都用到,例如打印(只是调用打印类的方法,而不是直接调打印机接口)、例如发送JMS消息、导出excel、导入数据到其他系统(ERP),都会用一个代理类操作。

另外,代理的模式能够在原来的方法上加入自己想要的逻辑。spring AOP就是使用了java的动态代理机制。



调停者(Mediator)

定义一个对象,将一组对象之间的交互封装起来,从而降低对象间的耦合度,避免了对象间的显式引用,并且可以独立地改变对象行为。

经常应用在界面控件的相关性操作中,例如选择省份后,另一个下拉框显示所有该省份的城市。

命令模式(command)

将调用封装在一个对象中,而不是直接写调用代码,因为设计时只知道在何时调用,而不知道具体执行什么操作。

最经常使用在事件通知机制,例如flex中的EventListener。

在command模式中加入undo方法,也可以实现撤销操作。

例如:工作流的画图工具。其中有一个具有一些按钮的工具条,用户可以通过这些按钮去添加各种活动节点。用户单击了 Draw Activty(画圆)按钮,系统就创建一个 DrawActivityCommand 对象,并调用了该对象的 Execute() 方法,将一个活动图标添加到画图编辑界面中,并且把这个command对象加入到私有变量(堆栈)中。用户拖动制图窗口中活动节点图标,放开鼠标时,系统创建一个MoveActivityCommand 对象并执行Execute() 方法,同样把这个command对象加入到私有变量(堆栈)中。

随后,用户单击了工具条上的 Undo 按钮。系统弹出已完成命令栈栈顶的 Command 对象,并调用该对象的 Undo() 方法。接收到 Undo() 消息时,MoveActivityCommand对象从目标位置移动回到原来的位置,如果再次点解Undo 按钮,则调用DrawActivityCommand的Execute() 方法,删除画图编辑界面中的活动图标。

备忘录(Memento)

为对象的状态提供存储和恢复的功能。同样也可以实现撤销操作,它比command模式实现撤销功能的优势是不用每次操作都创建一个command对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: