背景
- 持有、执行或还原备忘录的历史
- 实现:看管人通过发起者管理备忘录
示例
using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
namespace DesignPattern_Memento
{
// 扑克牌
public class Deck
{
private readonly string[]
suits = new[] { "heart", "spade", "club", "diamond" },
nums = new[] { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
private List<string> cards = new List<string>();
private Random random = new Random();
public Deck()
{
Shuffle();
}
// 洗牌
public void Shuffle()
{
cards = new List<string> { "small joker", "big joker" };
for (int i = 0; i < 52; i++)
{
string card = $"{suits[i / 13]}({nums[i % 13]})";
ReturnCard(card);
}
}
// 抽牌
public string DrawCard()
{
int at = random.Next(cards.Count);
string current = cards[at];
cards.Remove(current);
return current;
}
// 还牌
public void ReturnCard(string card)
{
if (cards.Contains(card)) return;
int at = random.Next(cards.Count);
cards.Insert(at, card);
}
}
// 备忘录接口
public interface IMemento
{
string GetCard();
}
// 备忘录,持有状态
public class Memento : IMemento
{
private readonly string card;
public Memento(string card)
{
this.card = card;
}
public string GetCard() => card;
public override string ToString() => card;
}
// 发牌者 =Originator
public class Dealer
{
private Deck deck = new Deck();
private string card;
public IMemento Save()
{
card = deck.DrawCard();
WriteLine($"Card {card} is saved.");
return new Memento(card);
}
public void Restore(IMemento memento)
{
card = memento.GetCard();
WriteLine($"Card {card} is restored.");
deck.ReturnCard(card);
}
}
// 看管人,备忘录容器及操作
public class CareTaker
{
private List<IMemento> history = new List<IMemento>();
private readonly Dealer dealer = new Dealer();
public void Backup()
{
var memento = dealer.Save();
history.Add(memento);
}
public void Undo()
{
var memento = history.Last();
history.Remove(memento);
dealer.Restore(memento);
}
public void PrintHistory()
{
WriteLine("The memento history is printing...");
foreach (var memento in history)
{
WriteLine($"- {memento}");
}
}
}
class Program
{
static void Main(string[] args)
{
var careTaker = new CareTaker();
careTaker.Backup();
careTaker.Backup();
WriteLine();
careTaker.PrintHistory();
WriteLine();
careTaker.Undo();
careTaker.Undo();
WriteLine();
careTaker.PrintHistory();
ReadKey();
}
}
}
网友评论