精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-23
最后修改:2010-02-23
有时候,我们需要创建对象曾在系统中出现过。在这个时候如果我们需要一个撤销功能以使状态回复到以前。这个时候我们需要备忘。 备忘模式的意图就是为对象提供状态存储和状态恢复功能。
下面就用一个经典范例来说明这种模式:
设计一个面板,它具有添加图片和撤销的功能。也就是说每当我们点击添加的时候就往上面添加一张图片,当我们点击撤销的时候就把刚才的上一张图片去掉。
这个时候点击undo时又回复到“图1”的状态. 这个方式看起来比较简单,我们采用MVC模式来设计它,模型图就不画了,不懂这模式的还得仔细自个想想。 主要有以下三个类:
.MementoControl 控制器
.MementoView 视图
.MementoModel 模型
其中View视图主要就是初始化界面及重写paintComponet函数来画图。部分代码如下: @Override protected void paintComponent(Graphics g) { // TODO Auto-generated method stub super.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; } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-02-23
最后修改:2010-02-23
对我来说还真是个新观点,
之前以为只有保存游戏进度才能用到备忘录模式 |
|
返回顶楼 | |
发表时间:2010-02-23
Durian 写道 对我来说还真是个新观点,
之前以为只有保存游戏进度才能用到备忘录模式 设计模式的应用还是很广泛的 |
|
返回顶楼 | |
浏览 2370 次