观察者模式
股票提醒
当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。
类图
源代码
Java
package rjsj.no21;
public class ConcreteObs implements Observer{
@Override
public void response1() {
System.out.println("买股票!");
}
@Override
public void response2() {
System.out.println("大哭一场!");
}
}
package rjsj.no21;
public class ConcreteSub extends Subject{
@Override
public void up() {
System.out.println("价格上涨5%");
for (Object obs:observers){
((Observer)obs).response1();
}
}
@Override
public void down() {
System.out.println("价格下降5%");
for (Object obs:observers){
((Observer)obs).response2();
}
}
}
package rjsj.no21;
public interface Observer {
void response1();
void response2();
}
package rjsj.no21;
import java.util.ArrayList;
public abstract class Subject {
protected ArrayList observers = new ArrayList();
public void attach(Observer obs){
observers.add(obs);
}
public void detach(Observer obs){
observers.remove(obs);
}
public abstract void up();
public abstract void down();
}
package rjsj.no21;
public class Client {
public static void main(String[] args) {
Subject subject=new ConcreteSub();
Observer observer = new ConcreteObs();
//添加观察者
subject.attach(observer);
subject.up();
subject.down();
}
}
C++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class MyObserver
{
public:
virtual void response1() = 0;
virtual void response2() = 0;
};
class Investor:public MyObserver
{
public:
void response1(){
cout<<"买股票"<<endl;
}
void response2(){
cout<<"大哭一场"<<endl;
}
};
class Subject
{
public:
Subject(){}
virtual ~Subject(){}
virtual void attach(MyObserver *observer)=0;
virtual void detach(MyObserver *observer)=0;
virtual void stockUp()=0;
virtual void stockDown()=0;
};
class Stock:public Subject
{
public:
void attach(MyObserver *observer)
{
observers.push_back(observer);
}
void detach(MyObserver *observer)
{
vector<MyObserver*>::iterator observer_rm = find(observers.begin(), observers.end(), observer);
observers.erase(observer_rm);
}
void stockUp()
{
cout<<"-----股票上涨5%-----"<<endl;
vector <MyObserver *>::iterator iObserver = observers.begin();
while(iObserver != observers.end())
{
(*iObserver)->response1();
iObserver++;
}
}
void stockDown()
{
vector <MyObserver *>::iterator iObserver = observers.begin();
cout<<"-----股票下降5%-----"<<endl;
while(iObserver != observers.end())
{
(*iObserver)->response2();
iObserver++;
}
}
private:
vector<MyObserver*> observers;
};
int main()
{
Stock subject;
Investor obs;
subject.attach(&obs);
subject.stockUp();
subject.stockDown();
}
运行截图



浙公网安备 33010602011771号