大话设计模式-观察者模式

来源:互联网 发布:怪物猎人捏脸数据 编辑:程序博客网 时间:2024/06/05 16:21

本文转载自点击打开链接
需求
设计一个前台通知同事老板回来了的程序。
实现
级别1

import java.util.*;//前台秘书类  public class Secretary  {    private List<StockObserver> observers = new ArrayList<StockObserver>();    private String action;    public void attach(StockObserver observer)    {        observers.add(observer);    }    public void announce()    {        for (StockObserver obj : observers)        {            obj.update();        }    }    public String getAction()    {        return action;    }    public void setAction(String action)    {        this.action = action;    }  }  
//看股票同事类  public class StockObserver  {    private String name;    private Secretary sub;    public StockObserver(String name, Secretary sub)    {        this.name = name;        this.sub = sub;    }    public void update()    {        System.out.println(sub.getAction() + "  " + name + "关闭股票行情,继续工作!");    }  }  
public class Main  {      public static void main(String[] args)      {          // 前台小组童子喆          Secretary tongzizhe = new Secretary();          // 看股票的同事          StockObserver tongshi1 = new StockObserver("魏关姹", tongzizhe);          StockObserver tongshi2 = new StockObserver("易管查", tongzizhe);          //前台记下了两位同事          tongzizhe.attach(tongshi1);          tongzizhe.attach(tongshi2);          //发现老板回来          tongzizhe.setAction("老板回来了!");          //通知两个同事          tongzizhe.announce();      }  } 
前台和看股票者互相耦合,前台类要增加观察者,观察者类需要前台的状态。
级别2
//抽象的观察者  public abstract class Observer  {    protected String name;    protected Secretary sub;    public Observer(String name, Secretary sub)    {        this.name = name;        this.sub = sub;    }    public abstract void update();  }  
public class StockObserver extends Observer  {      public StockObserver(String name, Secretary sub)      {          super(name, sub);      }      public void update()      {          System.out.println(sub.getAction() + "  " + name + "关闭股票行情,继续工作!");      }  }
public class NBAObserver extends Observer  {      public NBAObserver(String name, Secretary sub)      {          super(name, sub);      }      public void update()      {          System.out.println(sub.getAction() + "  " + name + "关闭NBA直播,继续工作!");      }  }  
import java.util.*;//前台秘书类  public class Secretary  {      private List<Observer> observers = new ArrayList<Observer>();      private String action;      public void attach(Observer observer)      {          observers.add(observer);      }      public void detach(Observer observer)      {          observers.remove(observer);      }      public void announce()      {          for (Observer obj : observers)          {              obj.update();          }      }      public String getAction()      {          return action;      }      public void setAction(String action)      {          this.action = action;      }  }    
public class Main  {      public static void main(String[] args)      {          // 前台小组童子喆          Secretary tongzizhe = new Secretary();          // 看股票的同事          StockObserver tongshi1 = new StockObserver("魏关姹", tongzizhe);          NBAObserver tongshi2 = new NBAObserver("易管查", tongzizhe);          //前台记下了两位同事          tongzizhe.attach(tongshi1);          tongzizhe.attach(tongshi2);          //发现老板回来          tongzizhe.setAction("老板回来了!");          //通知两个同事          tongzizhe.announce();      }  }
前台秘书是一个具体的类,也应该抽象出来。
级别3
//通知者接口  public interface Subject  {    void attach(Observer observer);    void detach(Observer observer);    void announce();    String getAction();    void setAction(String action);  }
import java.util.*;public class Secretary implements Subject  {      private List<Observer> observers = new ArrayList<Observer>();      private String action;      public void attach(Observer observer)      {          observers.add(observer);      }      public void detach(Observer observer)      {          observers.remove(observer);      }      public void announce()      {          for (Observer obj : observers)          {              obj.update();          }      }      public String getAction()      {          return action;      }      public void setAction(String action)      {          this.action = action;      }  }  
import java.util.*;public class Boss implements Subject  {      private List<Observer> observers = new ArrayList<Observer>();      private String action;      public void attach(Observer observer)      {          observers.add(observer);      }      public void detach(Observer observer)      {          observers.remove(observer);      }      public void announce()      {          for (Observer obj : observers)          {              obj.update();          }      }      public String getAction()      {          return action;      }      public void setAction(String action)      {          this.action = action;      }  } 
//抽象的观察者  public 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();  }
public class StockObserver extends Observer  {      public StockObserver(String name, Subject sub)      {          super(name, sub);      }      public void update()      {          System.out.println(sub.getAction() + "  " + name + "关闭股票行情,继续工作!");      }  } 
public class NBAObserver extends Observer  {      public NBAObserver(String name, Subject sub)      {          super(name, sub);      }      public void update()      {          System.out.println(sub.getAction() + "  " + name + "关闭NBA直播,继续工作!");      }  }  
public class Main  {      public static void main(String[] args)      {          // 老板胡汉三          Boss huhansan = new Boss();           // 看股票的同事          StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);          // 看NBA的同事          NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);          huhansan.attach(tongshi1);          huhansan.attach(tongshi2);          huhansan.detach(tongshi1);          // 老板回来了          huhansan.setAction("我胡汉三回来了!");          huhansan.announce();      }  } 
观察者模式又叫发布-订阅模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

//Subject类public abstract class Subject  {      private List<Observer> observers = new ArrayList<Observer>();      public void attach(Observer observer)      {          observers.add(observer);      }      public void detach(Observer observer)      {          observers.remove(observer);      }      public void announce()      {          for (Observer obj : observers)          {              obj.update();          }      }}  //Observer类public abstract class Observer  {      public abstract void update();  }  //ConcreteSubject类public class ConcreteSubject extends Subject  {      private String subjectState;      public String getSubjectState()      {          return subjectState;      }      public void setSubjectState(String subjectState)      {          this.subjectState = subjectState;      }  }  //ConcreteObserver类  public class ConcreteObserver extends Observer  {      private String name;      private String observerState;      private ConcreteSubject subject;      public ConcreteObserver(String name, ConcreteSubject subject)      {          this.name = name;          this.subject = subject;      }      public void update()      {          observerState = subject.getSubjectState();          System.out.println("观察者" + name + "的新状态是" + observerState);      }      public ConcreteSubject getSubject()      {          return subject;      }      public void setSubject(ConcreteSubject subject)      {          this.subject = subject;      }  }  //客户端代码  public class Main  {      public static void main(String[] args)      {          ConcreteSubject s = new ConcreteSubject();          s.attach(new ConcreteObserver("X", s));          s.attach(new ConcreteObserver("Y", s));          s.attach(new ConcreteObserver("Z", s));          s.setSubjectState("ABC");          s.announce();      }  }  
















0 0
原创粉丝点击