11.24

软件设计                  石家庄铁道大学信息学院

 

实验 21:观察者模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解观察者模式的动机,掌握该模式的结构;

2、能够利用观察者模式解决实际问题。

 

[实验任务一]:股票提醒

当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。

实验要求:

1. 提交源代码;

2. 提交类图;

3. 注意编程规范。

 

 

package ceshi;

 

import java.util.ArrayList;

public class Gufen extends Subject{

    public void up(){

        System.out.println("****股份上涨15%****");

        for(Observer guan:observers){

            guan.buy();

        }

    }

    public void down(){

        System.out.println("****股份下跌15%****");

        for(Observer guan:observers){

            guan.cry();

        }

    }

}

 

 

package ceshi;

 

public class Gumin implements Observer{

    private String name;

    public Gumin(String a){name=a;}

    public void buy(){

        System.out.println("股民"+name+"买了一些股票");

    }

    public void cry(){

        System.out.println("股民"+name+"哭了");

    }

}

 

package ceshi;

 

public class main {

    public static void main(String[] args) {

        Gufen f=new Gufen();

        Gumin g1=new Gumin("");

        Gumin g2=new Gumin("");

        f.attach(g1);

        f.attach(g2);

        f.up();

        f.down();

    }

}

 

 

#include<iostream>

#include<list>

#include<string>

using namespace std;

//抽象观察者

class Observer{

protected:

    string name;

public:

    virtual void buy()=0;

    virtual void cry()=0;

};

//具体观察者

class Gumin:public Observer{

public:

    Gumin(string name){

        this->name=name;

    }

    void buy(){

        cout<<"股民"<<name<<"买了一些股票"<<endl;

    }

    void cry(){

        cout<<"股民"<<name<<"哭了"<<endl;

    }

};

//抽象主题类

class Subject{

protected:

    list<Observer*> observers;

public:

    void attach(Observer *obs){

        observers.push_back(obs);

    }

    void detach(Observer *obs){

        observers.remove(obs);

    }

    virtual void up()=0;

    virtual void down()=0;

};

//具体主题类

class Gufen:public Subject{

public:

    void up(){

        cout<<"*****股份上涨15%*****"<<endl;

        list<Observer*>::iterator iter = observers.begin();

        for(; iter != observers.end(); iter++)

            (*iter)->buy();

    }

    void down(){

        cout<<"*****股份下跌15%*****"<<endl;

        list<Observer*>::iterator iter = observers.begin();

        for(; iter != observers.end(); iter++)

            (*iter)->cry();

    }

};

//测试函数

int main(){

    Observer *obs1,*obs2;

    obs1=new Gumin("");

    obs2=new Gumin("");

    Subject *sub;

    sub=new Gufen();

    sub->attach(obs1);

    sub->attach(obs2);

    sub->up();

    sub->down();

}

 

 

 

posted @   秋渡晚枫  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示