大话设计模式上的例子,老板回来秘书通知员工
c#版
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guancha
{
interface Subject
{
void Attach(Observer observer);
void Detach(Observer observer);
void Notify();
string SubjectState
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guancha
{
class Boss:Subject
{
private List<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; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guancha
{
class Sec : Subject
{
private List<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; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guancha
{
abstract class Observer
{protected string name;
protected Subject sub;
public Observer(string name,Subject sub)
{ this.name = name;
this.sub = sub;
}
public abstract void Update();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guancha
{
class StockObserver:Observer
{public StockObserver(string name,Subject sub):base(name,sub)
{ }
public override void Update()
{
Console.WriteLine("{0} {1} 关闭股票行情,继续工作",sub.SubjectState, name);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guancha
{
class NbaObserver:Observer
{public NbaObserver(string name,Subject sub):base(name,sub)
{ }
public override void Update()
{
Console.WriteLine("{0} {1} 李辉关闭NBA,开始工作");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guancha
{
class Program
{
static void Main(string[] args)
{
Sec huhan = new Sec();
StockObserver tongshi1 = new StockObserver("王浩", huhan);
NbaObserver tongshi2 = new NbaObserver("李辉", huhan);
huhan.Attach(tongshi1);
huhan.Attach(tongshi2);
huhan.SubjectState = "胡汉回来了";
huhan.Notify();
}
}
}
java版
package guanchazhe;
import java.util.Observable;
public class Boss extends Observable {
private String action;
public void TongZhi()
{setChanged();
this.notifyObservers(action);
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
package guanchazhe;
import java.util.Observable;
import java.util.Observer;
public class Sec extends Observable {
private String action;
public void Tongzhi()
{this.notifyObservers(action);
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
package guanchazhe;
import java.util.Observable;
import java.util.Observer;
public class StockObserver implements Observer {
private String name;
public StockObserver(String name) {
this.name = name;
}
public void update(Observable o,Object arg)
{
System.out.println(arg+name+"关闭股票继续工作");
}
}
package guanchazhe;
import java.util.Observable;
import java.util.Observer;
public class NbaObserver implements Observer {
private String name;
public NbaObserver(String name) {
this.name = name;
}
public void update(Observable o, Object arg) {
System.out.println(arg+name+"关闭nba继续工作");
}
}
package guanchazhe;
public class Test {
public static void main(String args[])
{StockObserver o1=new StockObserver("王浩");
Boss huhan=new Boss();
huhan.setAction("我胡汉三回来了");
huhan.addObserver(o1);
NbaObserver o2=new NbaObserver("李辉");
huhan.addObserver(o2);
huhan.TongZhi();
}
}
用c#委托改进
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace laobanweituo
{
interface Subject
{
void Notify();
string SubjectState
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace laobanweituo
{
class Boss : Subject
{
public delegate void EventHandler();
public event EventHandler Update;
private string action;
public void Notify()
{
Update();
}
public string SubjectState
{
get
{ return action; }
set
{ action = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace laobanweituo
{
class NbaObserver
{
private string name;
private Subject sub;
public NbaObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public void CloseNbaLive()
{
Console.WriteLine("{0}{1}关闭Nba直播",sub.SubjectState,name);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace laobanweituo
{
class StockObserver
{
private string name;
private Subject sub;
public StockObserver(string name,Subject sub)
{ this.name = name;
this.sub = sub;
}
public void CloseStockMarket()
{
Console.WriteLine("{0}{1}关闭股票行情",sub.SubjectState,name);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace laobanweituo
{
class Program
{
static void Main(string[] args)
{
Boss huhan = new Boss();
StockObserver t1 = new StockObserver("王浩", huhan);
NbaObserver t2 = new NbaObserver("李辉", huhan);
huhan.Update += new Boss.EventHandler(t1.CloseStockMarket);
huhan.Update += new Boss.EventHandler(t2.CloseNbaLive);
huhan.SubjectState = "胡汉回来了";
huhan.Notify();
}
}
}