读书人

设计方式之略见一斑(Memento备忘录模式

发布时间: 2012-11-05 09:35:12 作者: rapoo

设计模式之略见一斑(Memento备忘录模式)

??? 有时候,我们需要创建对象曾在系统中出现过。在这个时候如果我们需要一个撤销功能以使状态回复到以前。这个时候我们需要备忘。

??? 备忘模式的意图就是为对象提供状态存储和状态恢复功能。

?

?

下面就用一个经典范例来说明这种模式:

?

???? 设计一个面板,它具有添加图片和撤销的功能。也就是说每当我们点击添加的时候就往上面添加一张图片,当我们点击撤销的时候就把刚才的上一张图片去掉。


????????????????
?????????????????????设计方式之略见一斑(Memento备忘录模式)
???
?????????????????????????????????????????????????????????????????????????????????????图1

?


??????????????????
??????????????????????? 设计方式之略见一斑(Memento备忘录模式)
???????????????????????
?????????????????????????????????????????????????????????????????????????????????图2

?

这个时候点击undo时又回复到“图1”的状态.

这个方式看起来比较简单,我们采用MVC模式来设计它,模型图就不画了,不懂这模式的还得仔细自个想想。

主要有以下三个类:

?

.MementoControl 控制器

.MementoView 视图

.MementoModel 模型

其中View视图主要就是初始化界面及重写paintComponet函数来画图。部分代码如下:

@Overrideprotected void paintComponent(Graphics g) {// TODO Auto-generated method stubsuper.paintComponent(g);List<Point> list= (List<Point>) control.getModel().getStacks().peek();if(list.size()==0||list.size()==1){undo.setEnabled(false);}else{undo.setEnabled(true);}for(int i = list.size()-1;i>=0;i--){Point point  =(Point) list.get(i);g.drawImage(image, (int)point.getX(), (int) point.getY(), this);}}

?

?model类主要就是对于视图上一些状态所对应的变量的控制

主要有添加跟撤销这两个函数,以及采用Stack类来保存备忘.

部分方法如下:

/** * 添加图片 * @param point */public void add(Point point){List<Point> olds = stacks.peek();List<Point> news = new ArrayList<Point>(olds);news.add(0,(Point)point.clone());stacks.push(news);}/** * 撤销 * */public void undo(){stacks.pop();}

?

Control控制器就是连接视图跟模型的bridge,响应view上的动作

?

public class MementoControl {private MementoModel model;public MementoControl(){model = new MementoModel();}public MementoModel getModel() {return model;}public void setModel(MementoModel model) {this.model = model;}}

?

?

?

?

1 楼 Durian 2010-02-23 对我来说还真是个新观点,
之前以为只有保存游戏进度才能用到备忘录模式 2 楼 行者买刀 2010-02-23 Durian 写道对我来说还真是个新观点,
之前以为只有保存游戏进度才能用到备忘录模式
设计模式的应用还是很广泛的

读书人网 >软件开发

热点推荐