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

类图:

Java代码:

public class Investor implements MyObserver {

    @Override
public void response1() {
// TODO Auto-generated method stub
System.out.println("股民买股票");
} @Override
public void response2() {
// TODO Auto-generated method stub
System.out.println("股民大哭一场");
} } public interface MyObserver {
void response1();
void response2();
} public class Stock extends Subject{ @Override
public void stockUp() {
// TODO Auto-generated method stub
System.out.println("股票上涨5%");
for(Object obs:observers) {
((MyObserver)obs).response1();
}
} @Override
public void stockDown() {
// TODO Auto-generated method stub
System.out.println("股票下降5%");
for(Object obs:observers) {
((MyObserver)obs).response2();
}
} } import java.util.ArrayList; public abstract class Subject {
protected ArrayList observers=new ArrayList();
//注册方法
public void attach(MyObserver observer) {
observers.add(observer);
}
//注销方法
public void detach(MyObserver observer) {
observers.remove(observer);
}
public abstract void stockUp();
public abstract void stockDown();
} public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
Subject subject=new Stock();
MyObserver obs1;
obs1=new Investor();
subject.attach(obs1);
subject.stockUp();
subject.stockDown();
}
}

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();
}

运行结果:

Java/C++实现观察者模式--股票价格的更多相关文章

  1. 设计模式:java及spring观察者模式(有利于代码解耦)

    http://www.cnblogs.com/softidea/p/5716870.html 什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环 ...

  2. java设计模式之观察者模式以及在java中作用

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...

  3. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  4. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  5. JAVA设计模式 之 观察者模式(JDK内置实现)

    简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...

  6. JAVA设计模式 之 观察者模式

    简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...

  7. java设计优化--观察者模式

    观察者模式介绍 观察者模式是一种非常有用的设计模式,在软件系统中,当一个对象的行为依赖于另一个对象的状态时,观察者模式就非常有用.如果不适用观察者模式,而实现类似的功能,可能就需要另外启动一个线程不停 ...

  8. Java中的观察者模式

    让一个类能够被观察,则该类需要继承java.util.Observable类. 要让一个类成为观察者,则该类需要实现java.util.Observable接口. 让观察者和被观察者建立联系通过Obs ...

  9. 理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...

随机推荐

  1. 数据库连接池与SQL工具类

    数据库连接池与SQL工具类 1.数据库连接池 依赖包 pymysql dbutils # -*- coding: utf-8 -*- ''' @Time : 2021/11/19 16:45 @Aut ...

  2. postman-接口测试常用test模块

    一.配置环境变量区分不同运行环境(开发.测试.生产等). 对接口进行测试时,不同环境往往对应不同的域名或IP,在Postman里一个接口域名相同但因为地址不同重复写多次很明显是愚蠢的做法,下面我们可以 ...

  3. Yaconf-配置管理扩展

    1.下载yaconf安装包git clone https://github.com/laruence/yaconf.git2.目录切换至yaconf,编译生成so 文件(找到你的phpize位置) / ...

  4. buffer 和 cache (转)

    Cache是把最常用的工具放在手边, Buffer是你家的垃圾桶,你平时的垃圾先扔在垃圾桶里,等垃圾桶满了再扔垃圾. Cache的存在原因是对资源调用的空间局部性,你现在在看一本数学书,那么极有可能你 ...

  5. stash —— 一个极度实用的Git操作

    今天要介绍的 Git 操作就是 stash,毫不夸张地说,每个用 Git 的开发人员都一定要会懂怎么使用. 在介绍之前,不知道你有没有和我一样的经历:某一天,我正在一个 feature 分支上高高兴兴 ...

  6. MySQL — 索引

    目录 1.索引概述 2.索引结构 3.索引分类 4.索引语法 5.SQL 性能分析 5.1.执行频次 5.2.慢日志查询 5.3.profile 5.4.explain 6.索引使用规则 6.1.单列 ...

  7. openEuler网络配置+换源+桌面环境ukui等基本环境部署

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 1.网络配置 你可以选择查看官方文档进行配置:配置网络 (openeuler.org) 接下来的操作基本都需要root权限,所以直接使用root用户 ...

  8. 17调试经验之串口读写flash协议

    一是设计功能 我的理解协议就是一个命令包,通过给出不同的控制命令,来调动不同的功能模块,实现不同的功能,如读数据,写数据,擦除等. 二设计过程 先看了尤老师的视频,主要讲了大致设计原理和总体框架,当然 ...

  9. 如何在vscode中编写.net core 项目(vscode)

    1.下载拓展  .NET Core Extension Pack  (作者:保哥) 这个里面将需要的插件都打包了小白一键下载就好了 2.下载扩展   vscode-solution-explorer ...

  10. idea使用技巧、心得1

    0.安装idea之后的准备 (1) 永久快乐使用:在我的博客搜索安装idea关键词既可 (2) 取消更新: (3) idea 官网的关于idea的使用手册:https://www.jetbrains. ...