`
行者买刀
  • 浏览: 191282 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

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

    博客分类:
  • J2SE
阅读更多

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

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

 

 

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

 

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


                
                     
   
                                                                                     图1

 


                  
                       
                       
                                                                                 图2

 

这个时候点击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;
	}
}

 

 

 

 

  • src.rar (4.9 KB)
  • 下载次数: 60
  • 大小: 13.5 KB
  • 大小: 16 KB
分享到:
评论
2 楼 行者买刀 2010-02-23  
Durian 写道
对我来说还真是个新观点,
之前以为只有保存游戏进度才能用到备忘录模式

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

相关推荐

    设计模式之略见一斑(Observer观察者模式)

    NULL 博文链接:https://lgh3292.iteye.com/blog/600905

    21种设计模式略见一斑

    NULL 博文链接:https://teddywang.iteye.com/blog/769122

    循环冗余校验-概念 算法 应用

    CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。

    CRC16或32校验

    CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑

    CRC算法和实现

    例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。 差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能...

Global site tag (gtag.js) - Google Analytics