美文网首页
{C#}设计模式辨析.备忘录

{C#}设计模式辨析.备忘录

作者: 码农猫爸 | 来源:发表于2021-08-13 06:32 被阅读0次

背景

  • 持有、执行或还原备忘录的历史
  • 实现:看管人通过发起者管理备忘录

示例

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();
        }
    }
}

相关文章

网友评论

      本文标题:{C#}设计模式辨析.备忘录

      本文链接:https://www.haomeiwen.com/subject/cguuvltx.html