观察者模式的应用
网上商店中如果商品(product)在名称(name)、价格(price)等方面有变化,系统能自动通知会员,将是网上商店区别传统商店的一大特色。如何设计实现? 说明你所选择的设计模式,画出类关系图并指明各个类的角色。应用外观模式,用C#控制台应用程序改进该设计。绘制该模式的UML图。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace shiyan9guanchazhemoshi
{
abstract class Observer
{
protected Subject sub;
public Observer( Subject sub)
{
this.sub = sub;
}
public abstract void Update();
}
class PriceObserver : Observer
{
public PriceObserver(Subject sub) : base( sub){ }
public override void Update()
{
Console.WriteLine("{0}:价格变化",sub.SubjectState);
}
}
class NameObserver : Observer
{
public NameObserver(Subject sub) : base(sub) { }
public override void Update()
{
Console.WriteLine("{0}:名称变化", sub.SubjectState);
}
}
interface Subject
{
void Attach(Observer observer);
void Detach(Observer observer);
void Notify();
string SubjectState
{
get;
set;
}
}
class Secretary : Subject
{
private IList<Observer> observers = new List<Observer>();
private string action;
public void Attach(Observer observer)
{
observers.Add(observer);
}
public void Detach(Observer observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach (Observer o in observers)
o.Update();
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
class Program
{
static void Main(string[] args)
{
Secretary sc = new Secretary();
PriceObserver po = new PriceObserver(sc);
NameObserver no = new NameObserver(sc);
sc.Attach(po);
sc.Attach(no);
sc.SubjectState = "有变化---5/19";
sc.Notify();
sc.Detach(no);
sc.SubjectState = "有变化---5/20";
sc.Notify();
Console.Read();
}
}
}