观察者模式(拉模式)

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
IRedEnvelope redEnvelope = new RedEnvelope(100);
IObserver jackObserver = new Jack(redEnvelope);
IObserver andreObserver = new Andre(redEnvelope);
redEnvelope.AddObserver(jackObserver);
redEnvelope.AddObserver(andreObserver);
jackObserver.GrabRedEnvelope();
jackObserver.ShowGrabRedEnvelopeHistory();
andreObserver.GrabRedEnvelope();
andreObserver.ShowGrabRedEnvelopeHistory();
Console.ReadKey();
}
}

public interface IObserver
{
void ReceiveMessage(string message);
void GrabRedEnvelope();
void ShowGrabRedEnvelopeHistory();
}

public class Person : IObserver
{
private string _name;
private IRedEnvelope _redEnvelope;
public Person(string name, IRedEnvelope redEnvelope)
{
_redEnvelope = redEnvelope;
_name = name;
}
public void ReceiveMessage(string message)
{
Console.WriteLine($"{_name}接到信息:");
Console.WriteLine(message);
Console.WriteLine($"红包还剩{_redEnvelope.Money}");
}
public void GrabRedEnvelope()
{
int value = new Random().Next(0, _redEnvelope.Money);
string message = string.Empty;
if (_redEnvelope.Money > value)
{
_redEnvelope.Money = _redEnvelope.Money - value;
message = $"{_name}抢了{value}";
}
else
{
message = $"{_name}没抢到红包,红包已空";
}
_redEnvelope.AddGrabRedEnvelopeHistory(message);
_redEnvelope.NotifyMessage(message);
}
public void ShowGrabRedEnvelopeHistory()
{
var result = _redEnvelope.GetGrabRedEnvelopeHistory();
Console.WriteLine($"抢红包历史纪录:{result}");
}
public string Name { get { return _name; } }
}

public class Jack : Person
{
public Jack(IRedEnvelope redEnvelope) : base("jack", redEnvelope)
{
}
}

public class Andre : Person
{
public Andre(IRedEnvelope redEnvelope) : base("andre", redEnvelope)
{
}
}

public interface IRedEnvelope
{
void AddObserver(IObserver observer);
void RemoverObserver(IObserver observer);
int Money { get; set; }
void NotifyMessage(string message);
string GetGrabRedEnvelopeHistory();
void AddGrabRedEnvelopeHistory(string message);
}

public class RedEnvelope : IRedEnvelope
{
private int _money;
private List<IObserver> _listOberver = new List<IObserver>();
private List<string> _listGrabRedEnvelopeHistory = new List<string>();
public int Money
{
get
{
return _money;
}
set {
_money = value;
}
}

public RedEnvelope(int money)
{
_money = money;
}
public void AddObserver(IObserver observer)
{
_listOberver.Add(observer);
}
public void RemoverObserver(IObserver observer)
{
_listOberver.Remove(observer);
}
public void NotifyMessage(string message)
{
foreach (var item in _listOberver)
{
item.ReceiveMessage(message);
}
}

public string GetGrabRedEnvelopeHistory()
{
string result= string.Join(",",_listGrabRedEnvelopeHistory);
return result;
}

public void AddGrabRedEnvelopeHistory(string message)
{
_listGrabRedEnvelopeHistory.Add(message);
}
}
}

posted @ 2019-03-27 14:34  东东东  阅读(88)  评论(0)    收藏  举报