디자인 모델 II 12 : 메모 모드 (기념물)

모든 사람은 둘 다 그들이 다시 시작할 수 있도록 자신의 실수를 만회하기 위해 "후회"의 종류를 원하는, 실수를 가지고 있지만, 현실은 잔인하다. 컴퓨터 응용 프로그램에서, 고객은 종종 그들에게 "후회"의 가용성을 실수를 할 것인가? 물론 우리는 할 수 있지만이 필요하다. 이 기능에 의해 구현된다 "메모 모드."

IE에있다; 사실, 많은 응용 프로그램 소프트웨어는 현재 작업 이전 상태로 문서 다시 때 누르면 Ctrl + Z 키 조합을 철회 할 수있는 경우와 같은 워드, 메모장, 포토샵, 편집 소프트웨어 이클립스로이 기능을 제공 게임, 운영 체제, 데이터베이스 및 백업 작업을 재생할 때 중간 결과를 보관 백 키, 롤백 데이터베이스 트랜잭션 관리, 보드 게임이 범주에 속하는 기능을 취소합니다.

유감 사용자 데이터가 원래의 상태로되도록, 이러한 조작을 취소 할 때 메모 모드 오브젝트의 내부 상태를 기록 할 수있다.

정의 및 모델의 특성

정의 각서 (기념물) 모드 : 객체가 이전에 저장된 상태를 복원 할 수 있어야 나중에 때 그래서, 캡슐화, 캡처 및 객체의 내부 상태를, 위반없이 객체 외부의 상태를 저장. 이 모드는 스냅 샷 모드라고합니다.

메모 모드는 객체 행동 패턴, 주요 장점은 다음이다.

  • 이 상태를 복원 할 수있는 메커니즘을 제공합니다. 사용자는 상대적으로 쉽게 역사의 상태로 데이터를 복구 할 수 있어야합니다.
  • 내부 상태의 캡슐화를 달성하기 위해. 후원자를 만드는 것 외에도 다른 객체는 상태 정보에 액세스 할 수 없습니다.
  • 발사 인간을 단순화. 후원자 관리, 모든 상태 정보를 단일 책임의 원칙에 맞춰, 매니저에 의해 메모에 저장되어 관리하고 각 백업의 내부 상태를 유지해야합니다.


주요 단점은 : 자원 소비. 당신은 너무 많은 내부 상태 정보 또는 특히 자주를 저장하려는 경우, 상대적으로 큰 메모리 자원을 차지합니다.

아키텍처 및 구현 모델

핵심 모델은 메모를 관리하기위한 메모의 각서 클래스와 카테고리 매니저를 설계하고, 지금 우리는 그것의 구조와 구현을 배웁니다.

1. 구조 모델

메모 모드의 주요 역할은 다음이다.

  1. 발신자 (발신자) 역할 : 현재 시간의 기록 내부 상태 정보 제공은 메모에서 모든 정보에 액세스 할 수 있습니다, 메모 및 메모 데이터 복구를 작성하고 다른 비즈니스 기능을 달성했다.
  2. 각서 (기념물) 역할 : 내부 상태 스폰서를 저장하기위한 책임이 필요 이러한 내부 상태가 후원합니다.
  3. (관리인) 역할 관리자 : 각서를 관리하는 보존 및 액세스 메모 기능을 제공하지만,이 메모의 내용의 변경에 액세스 할 수 없습니다.


도 1에 도시 된도 메모 모드 구성.
 

                        도 각서 모드 구조.
 

실현 2. 모드

다음과 같이 메모 모드 코드는 다음과 같습니다

 

package memento;
public class MementoPattern
{
    public static void main(String[] args)
    {
        Originator or=new Originator();
        Caretaker cr=new Caretaker();       
        or.setState("S0"); 
        System.out.println("初始状态:"+or.getState());           
        cr.setMemento(or.createMemento()); //保存状态      
        or.setState("S1"); 
        System.out.println("新的状态:"+or.getState());        
        or.restoreMemento(cr.getMemento()); //恢复状态
        System.out.println("恢复状态:"+or.getState());
    }
}
//备忘录
class Memento
{ 
    private String state; 
    public Memento(String state)
    { 
        this.state=state; 
    }     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
}
//发起人
class Originator
{ 
    private String state;     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
    public Memento createMemento()
    { 
        return new Memento(state); 
    } 
    public void restoreMemento(Memento m)
    { 
        this.setState(m.getState()); 
    } 
}
//管理者
class Caretaker
{ 
    private Memento memento;       
    public void setMemento(Memento m)
    { 
        memento=m; 
    }
    public Memento getMemento()
    { 
        return memento; 
    }
}

프로그램 실행의 결과 다음과 같습니다 : 

初始状态:S0
新的状态:S1
恢复状态:S0

적용 사례의 모드

메모 모드를 사용하여 블라인드 디자인 게임 [실시 예 1].

분석 : 아름다움이있는 경우, 사각 날짜와 왕소군, 디아 찬, 양 Yuhuan의 네 미녀, 당신은 당신의 연인으로 그 중 하나를 선택할 수 있습니다, 당신은 앞의 선택에 만족하지 않는 경우 물론, 당신은 다시 선택할 수 있습니다,하지만 난 당신이 희망 너무 걱정하지 마십시오,이 게임 이벤트 후회 기능이 더 적절한 사용을 설계 "메모 모드를."

먼저, 각서의 역할은 아름다운 (여자) 클래스를 설계하자, 그들은 저장 및 뷰티 정보에 대한 기능을 제공 한 후 기자 역할 맹인 일 (당신) 클래스를 설계, 현재 시간의 내부 상태를 기록 정보 (임시 아내의 이름) 및 메모 및 메모 데이터 복구를 만들어 제공하고, 마지막으로, 관리자의 역할은 아름다운 스택 (GirlStack) 클래스의 정의, 맹인 명에 대한 저장, 메모를 관리 할 책임이있다 (당신) selectmen 아름다움 정보의 앞에,하지만 네 저장, 이벤트 기능을 후회 수 있습니다.

클라이언트 클래스는 (미용 스택 (GirlStack) 개체 및 블라인드 명 (당신) 오브젝트의 actionPerformed (ActionEvent를 전자), 4 개 크고 아름다운 이미지 인터페이스 방법 ActionListener를 처리하는 이벤트가 사람 눈을 멀게 구현하는 것을 포함하는 프로그램을 형성하도록 설계 ) 뷰티 선택된 이미지 형태로 표시된다. 도 2는 구조도이다.
 

                       그림 구조 데이트 게임


다음과 같이 코드입니다 :

package memento;
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
public class DatingGame
{
    public static void main(String[] args)
    {
        new DatingGameWin();
    }
}
//客户窗体类
class DatingGameWin extends JFrame implements ActionListener
{
    private static final long serialVersionUID=1L;   
    JPanel CenterJP,EastJP;
    JRadioButton girl1,girl2,girl3,girl4;
    JButton button1,button2;
    String FileName;
    JLabel g;
    You you;
    GirlStack girls;
    DatingGameWin()
    {
        super("利用备忘录模式设计相亲游戏");
        you=new You();
        girls=new GirlStack();       
        this.setBounds(0,0,900,380);            
        this.setResizable(false);
        FileName="src/memento/Photo/四大美女.jpg";   
        g=new JLabel(new ImageIcon(FileName),JLabel.CENTER);
        CenterJP=new JPanel();
        CenterJP.setLayout(new GridLayout(1,4));
        CenterJP.setBorder(BorderFactory.createTitledBorder("四大美女如下:"));
        CenterJP.add(g);   
        this.add("Center",CenterJP);
        EastJP=new JPanel();
        EastJP.setLayout(new GridLayout(1,1));
        EastJP.setBorder(BorderFactory.createTitledBorder("您选择的爱人是:"));
        this.add("East",EastJP);
        JPanel SouthJP=new JPanel();      
        JLabel info=new JLabel("四大美女有“沉鱼落雁之容、闭月羞花之貌”,您选择谁?");
        girl1=new JRadioButton("西施",true);
        girl2=new JRadioButton("貂蝉");
        girl3=new JRadioButton("王昭君");       
        girl4=new JRadioButton("杨玉环");
        button1=new JButton("确定");
        button2=new JButton("返回");
        ButtonGroup group=new ButtonGroup();
        group.add(girl1);
        group.add(girl2);
        group.add(girl3);
        group.add(girl4);
        SouthJP.add(info);
        SouthJP.add(girl1);
        SouthJP.add(girl2);
        SouthJP.add(girl3);
        SouthJP.add(girl4);
        SouthJP.add(button1);
        SouthJP.add(button2);
        button1.addActionListener(this);
        button2.addActionListener(this);
        this.add("South",SouthJP);        
        showPicture("空白");
        you.setWife("空白");
        girls.push(you.createMemento());    //保存状态
    }
    //显示图片
    void showPicture(String name)
    {
        EastJP.removeAll(); //清除面板内容
        EastJP.repaint(); //刷新屏幕
        you.setWife(name);        
        FileName="src/memento/Photo/"+name+".jpg";               
        g=new JLabel(new ImageIcon(FileName),JLabel.CENTER);                   
        EastJP.add(g);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            
    }
    @Override
    public void actionPerformed(ActionEvent e)
    {
        boolean ok=false;
        if(e.getSource()==button1)
        {
            ok=girls.push(you.createMemento());    //保存状态  
            if(ok && girl1.isSelected())
            {
                showPicture("西施");
            }
            else if(ok && girl2.isSelected())
            {
                showPicture("貂蝉");
            }
            else if(ok && girl3.isSelected())
            {
                showPicture("王昭君");
            }
            else if(ok && girl4.isSelected())
            {
                showPicture("杨玉环");
            }               
        }
        else if(e.getSource()==button2)
        {
            you.restoreMemento(girls.pop()); //恢复状态
            showPicture(you.getWife());
        }
    }
}
//备忘录:美女
class Girl
{ 
  private String name;
  public Girl(String name)
  { 
      this.name=name; 
  }     
  public void setName(String name)
  { 
      this.name=name; 
  }
  public String getName()
  { 
      return name; 
  }
}
//发起人:您
class You
{ 
    private String wifeName;    //妻子
    public void setWife(String name)
    { 
        wifeName=name; 
    }
    public String getWife()
    { 
        return wifeName; 
    }
    public Girl createMemento()
    { 
        return new Girl(wifeName); 
    }
    public void restoreMemento(Girl p)
    { 
        setWife(p.getName());
    } 
}
//管理者:美女栈
class GirlStack
{ 
    private Girl girl[];
    private int top;
    GirlStack()
    {
        girl=new Girl[5];
        top=-1;
    }
    public boolean push(Girl p)
    {
        if(top>=4)
        {
            System.out.println("你太花心了,变来变去的!");
            return false;
        }
        else
        {
            girl[++top]=p;
            return true;
        }
    }
    public Girl pop()
    {
        if(top<=0)
        {
            System.out.println("美女栈空了!");
            return girl[0];
        }
        else return girl[top--]; 
    }
}

도 3에 도시 된 프로그램의 결과.
 

                        게임의 소개팅 운영 결과

장면 모드의 응용 프로그램

그리고 배운 이전에 정의 된 기능, 구조 및 메모 모드의 구현, 다음과 같은 모드로 이제 응용 프로그램 시나리오.

  1. 우리는 게임을 할 때 중간 결과를 보관 등의 데이터 시나리오를 저장하고 복원해야합니다.
  2. 같은 워드, 메모장, 포토샵, 이클립스 소프트웨어로, 롤백 작업의 시나리오를 제공하는 것이 바람직 할 수에서 Ctrl + Z 키 조합뿐만 아니라, 트랜잭션 데이터베이스 작업을 편집하는 동안.

확장 모드

메모 모드는 전술 한, 단일 백업 상태로서는이 있고, 백업 상태의 많은 예가있다. 여기에 메모 모드 방법은 프로토 타입 모델을 섞는다. 메모 모드에서, 다음, 당신은 발기인이 그 기능을 백업 할 Cloneable 인터페이스를 구현 할 수있는 그렇다면, 프로토 타입 및 복제 모드 () 자동 백업 기능과 방법의 정보 "스폰서"백업은 "각서"를 정의하여 당신은 메모 카테고리, 그림 4에 도시 된 구조를 삭제할 수 있습니다.
 

                     프로토 타입도 메모 모드 설정


다음 코드는 다음과 같습니다

package memento;
public class PrototypeMemento
{
    public static void main(String[] args)
    {
        OriginatorPrototype or=new OriginatorPrototype();
        PrototypeCaretaker cr=new PrototypeCaretaker();       
        or.setState("S0"); 
        System.out.println("初始状态:"+or.getState());           
        cr.setMemento(or.createMemento()); //保存状态      
        or.setState("S1"); 
        System.out.println("新的状态:"+or.getState());        
        or.restoreMemento(cr.getMemento()); //恢复状态
        System.out.println("恢复状态:"+or.getState());
    }
}
//发起人原型
class OriginatorPrototype  implements Cloneable
{ 
    private String state;     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
    public OriginatorPrototype createMemento()
    { 
        return this.clone(); 
    } 
    public void restoreMemento(OriginatorPrototype opt)
    { 
        this.setState(opt.getState()); 
    }
    public OriginatorPrototype clone()
    {
        try
        {
            return (OriginatorPrototype) super.clone();
        }
        catch(CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}
//原型管理者
class PrototypeCaretaker
{ 
    private OriginatorPrototype opt;       
    public void setMemento(OriginatorPrototype opt)
    { 
        this.opt=opt; 
    }
    public OriginatorPrototype getMemento()
    { 
        return opt; 
    }
}

 다음과 같이 프로그램의 운영 결과는 다음과 같습니다

初始状态:S0
新的状态:S1
恢复状态:S0

 

게시 된 136 개 원래 기사 · 원 찬양 6 · 전망 1534

추천

출처blog.csdn.net/weixin_42073629/article/details/104437906