2 回答

TA貢獻1868條經驗 獲得超4個贊
使用備忘錄模式進行多次撤銷操作
看護人代碼:
public class Caretaker
{
private Memento chartMemento;
public Memento Memento
{
get
{ return chartMemento; }
set
{ chartMemento = value; }
}
}
紀念品代碼:
public class Memento
{
private Series _series =new Series();
public Memento(Originator org)
{
this._series.Points.Clear();
foreach (var dp in org.OSeries.Points) this._series.Points.Add(dp.Clone());
}
public Memento(Series mseries)
{
this._series.Points.Clear();
foreach (var dp in mseries.Points) this._series.Points.Add(dp.Clone());
}
public Series MMseries
{
get
{
return _series;
}
set
{
_series = value;
}
}
}
發起人代碼
public class Originator{
private Series _series = new Series();
public Originator() { }
public Originator(Series series)
{
// _series = series;
_series.Points.Clear();
foreach (var dp in series.Points) _series.Points.Add(dp.Clone());
}
public Series OSeries
{
get
{
return _series;
}
set
{
_series = value;
}
}
public Memento SaveSeries()
{
return new Memento(_series);
}
public void RestoreSeries(Memento m)
{
//this._series = m.MMseries;
this._series.Points.Clear();
foreach (var dp in m.MMseries.Points) this._series.Points.Add(dp);
this._series.ChartType = SeriesChartType.Line;
}
}
在 Form1 中聲明對象列表及其計數器
Orginator _org;
List<Originator> list_org = new List<Originator>();
List<Caretaker> list_taker = new List<Caretaker>();
int obj_counter = 0;
Do 操作的代碼
list_org.Add(_org = new Originator(global_series));
Caretaker ct = new Caretaker();
ct.Memento = list_org[obj_counter++].SaveSeries();
list_taker.Add(ct);
撤銷操作的代碼:
if (obj_counter > 0)
{
list_org[--obj_counter].RestoreSeries(list_taker[obj_counter].Memento);
global_series.Points.Clear();
foreach (var dp in list_org[obj_counter].OSeries.Points)
global_series.Points.Add(dp);
}

TA貢獻1111條經驗 獲得超0個贊
Series是參考變量。
因此,您所做的所有更改都將針對該系列,并且您擁有的所有參考資料都將指向同一(原始)系列。
花哨的圖案,因為他們有用的可能是不能代替的基礎知識。要允許撤銷/重做你需要復制的的數據的不是,參考!
注意Series沒有Clone方法。
所以你需要自己做;在您的情況下,這歸結為復制 Points ..
但是對于更一般的情況,您可能想要復制其他系列屬性,最值得注意的是ChartType您為準備Series. 也許以工廠模式創建它..?
但也要注意DataPoint 確實有一個Clone方法。所以你可以Originator像這樣改變你的構造函數:
public Originator(Series series)
{
//_series = series;
foreach (var dp in series.Points) _series.Points.Add(dp.Clone());
}
事情將開始按預期工作。但是您也需要像這樣進行恢復,否則您將指向保存的系列,接下來的更改將更改它而不是圖表系列..:
public void RestoreSeries(Memento m)
{
// this._series = m.MMseries;
this._series.Points.Clear();
foreach (var dp in m.MMseries.Points) this._series.Points.Add(dp);
}
順便說一句:要清除所有系列,請使用chart.Series.Clear()!
- 2 回答
- 0 關注
- 171 瀏覽
添加回答
舉報