|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ
|
Mementoパターン (デザインパターン)
Mementoパターン 導入
Mementoパターンは、変更前のオブジェクトの状態を記憶しておくことにより、手続き後に前の状態に復元できるようにするパターンです
復元対象となるオブジェクト(Original)、記憶状態を表すオブジェクトをMemento、とします。 Originalクラスには記憶を保存するためのcreateMemento()メソッドと復元するrestoreMemento()メソッドを持ちます。
Mementoパターン ポイント
復元対象となるオブジェクトが記憶状態を保存するメソッド、復元するメソッドを実装します。 Mementoオブジェクトは、あくまで復元対象(Ordinal)の内部情報のコピーを示します。
UML Mementoパターン
C#ソースコード Mementoパターン
|
Sample.cs
|
|
using System;
using System.Collections;
namespace Memento
{
public class
State :ICloneable
{
private
int intYokin;
private
string strKanojo;
private
string strStatus;
public
int Yokin
{
set{this.intYokin=value;}
get{return this.intYokin;}
}
public
string Kanojo
{
set{this.strKanojo=value;}
get{return this.strKanojo;}
}
public
string Status
{
set{this.strStatus=value;}
get{return this.strStatus;}
}
public
object Clone()
{
return
MemberwiseClone();
}
}
public class
Original
{
private State state;
public Original(int intYokin,string strKanojo,string
strStarus)
{
this.state=new
State();
this.state.Yokin =intYokin;
this.state.Kanojo=strKanojo;
this.state.Status=strStarus;
}
public State OriginState
{
get{return this.state;}
}
public
void getStateInfo()
{
Console.WriteLine("現在の預金額 :{0}",this.state.Yokin);
Console.WriteLine("現在の彼女 :{0}",this.state.Kanojo);
Console.WriteLine("現在の地位 :{0}",this.state.Status);
}
public Memento CreateMemento()
{
return new Memento((State)state.Clone());
}
public
void ResotreMemento(Memento memento)
{
this.state =memento.GetState;
}
}
public class
Memento
{
private State state;
public Memento(State state)
{
this.state=state;
}
public State
GetState
{
get{return this.state;}
}
}
public class
Caretaker
{
private ArrayList Mementos
=new ArrayList();
public Memento getMemento(int index)
{
return
(Memento)Mementos[index];
}
public
void AddMemento(Memento Mem)
{
this.Mementos.Add(Mem);
}
}
class Class1
{
[STAThread]
static
void Main(string[] args)
{
Original Taro =new Original(10000,"地味子","フリーター");
Caretaker cr=new Caretaker();
cr.AddMemento(Taro.CreateMemento());
Taro.OriginState.Yokin=50000;
Taro.OriginState.Kanojo="派手ちゃん";
Taro.OriginState.Status="コンビニ店長";
cr.AddMemento(Taro.CreateMemento());
Taro.getStateInfo();
Taro.OriginState.Yokin=-20000;
Taro.OriginState.Kanojo="お嬢ちゃん";
Taro.OriginState.Status="青年実業家";
cr.AddMemento(Taro.CreateMemento());
Taro.getStateInfo();
Taro.ResotreMemento(cr.getMemento(0));
Taro.getStateInfo();
}
}
}
|
Memento 実行結果
UMLプラグインによる描画 Mementoパターン
Javaソースコード Mementoパターン
| State.java |
1: package menento;
2:
3: public class State implements Cloneable {
4:
5: private int Yokin;
6:
7: private String Kanojo;
8:
9: private String Status;
10:
11: public int getYokin() {
12: return Yokin;
13: }
14:
15: public void setYokin(int Yokin) {
16: this.Yokin = Yokin;
17: }
18:
19: public String getKanojo() {
20: return Kanojo;
21: }
22:
23: public void setKanojo(String Kanojo) {
24: this.Kanojo = Kanojo;
25: }
26:
27: public String getStatus() {
28: return Status;
29: }
30:
31: public void setStatus(String Status) {
32: this.Status = Status;
33: }
34:
35: public Object clone() throws CloneNotSupportedException {
36: return super.clone();
37: }
38:
39: }
|
| Origin.java |
1: package menento;
2:
3: public class Origin {
4:
5: private State state;
6:
7: public State getState() {
8: return state;
9: }
10:
11: public void setState(State state) {
12: this.state = state;
13: }
14:
15: public void getStateInfo() {
16: System.out.println("現在の預金額は" +this.state.getYokin()+"円です");
17: System.out.println("現在の彼女は" +this.state.getKanojo()+"です");
18: System.out.println("現在の地位は" +this.state.getStatus()+"やってます。");
19: }
20:
21: //状態をMementoオブジェクトとして返す。
22: public Memento createMemento() throws CloneNotSupportedException {
23: //状態のコピーを作り、Mementoインスタンスにセットして
24: //Mementoオブジェトを返します。
25: Memento forgetMemento =new Memento();
26: forgetMemento.setMementoState((State)this.state.clone());
27:
28: return forgetMemento;
29: }
30:
31: //Mementoオブジェクトから状態を復元する
32: public void restoreMemento(Memento memento) {
33: //Mementoオブジェクトから状態を再セットします。
34: this.state=memento.getMementoState();
35: }
36:
37: //コンストラクタで一発セット
38: public Origin(int Yokin, String Kanojo, String Status) {
39: this.state =new State();
40: this.state.setYokin(Yokin);
41: this.state.setKanojo(Kanojo);
42: this.state.setStatus(Status);
43: }
44:
45: }
|
| Memento.java |
1: package menento;
2:
3: public class Memento {
4:
5: private State MementoState;
6:
7: public State getMementoState() {
8: return MementoState;
9: }
10:
11: public void setMementoState(State MementoState) {
12: this.MementoState = MementoState;
13: }
14:
15: }
|
| Caretaker.java |
1: package menento;
2:
3: import java.util.ArrayList;
4:
5: public class Caretaker {
6:
7: private ArrayList mementos =new ArrayList();
8:
9: public Memento getMemento(int index) {
10: return (Memento)mementos.get(index);
11: }
12:
13: public void addMemento(Memento memento) {
14: this.mementos.add(memento);
15: }
16:
17: }
|
| StartClass.java |
1: package menento;
2:
3: public class StartClass {
4:
5: public static void main(String[] args) throws CloneNotSupportedException {
6:
7: //0番目の状態
8: Origin taro =new Origin(10000,"地味チャン","フリータ");
9: //記憶を管理する管理人インスタンスの作成
10: Caretaker caretaker =new Caretaker();
11:
12: //状態を報告
13: caretaker.addMemento(taro.createMemento());
14: taro.getStateInfo();
15:
16: //1番目の状態
17: taro.getState().setYokin(50000);
18: taro.getState().setKanojo("派手ちゃん");
19: taro.getState().setStatus("コンビニ店長");
20: //状態を報告
21: caretaker.addMemento(taro.createMemento());
22: taro.getStateInfo();
23:
24: //2番目の状態
25: taro.getState().setYokin(-200000);
26: taro.getState().setKanojo("お嬢ちゃん");
27: taro.getState().setStatus("青年実業家");
28: //状態を報告
29: caretaker.addMemento(taro.createMemento());
30: taro.getStateInfo();
31:
32: //0番目に記憶を復元
33: taro.restoreMemento(caretaker.getMemento(0));
34: taro.getStateInfo();
35: }
36: }
|
デザインパターン「ひとくちメモ」へ
Homeへもどる
|
|
| お天気情報 |
|
東京都 東京 - 今日の天気
|
曇り
-
|
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
東京都 東京 - 明日の天気
|
晴のち雨
-
|
|
|
最高
|
最低
|
| 気温
|
9 |
3 |
| 湿度
|
48.2 |
37.4 |
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
東京都 東京 - あさっての天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
11 |
4 |
| 湿度
|
51.8 |
39.2 |
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
大阪府 大阪 - 今日の天気
|
晴のち曇
-
|
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
大阪府 大阪 - 明日の天気
|
雨
-
|
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
大阪府 大阪 - あさっての天気
|
曇時々晴
-
|
|
|
最高
|
最低
|
| 気温
|
7 |
3 |
| 湿度
|
44.6 |
37.4 |
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
| livedoorのWebサービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|