当股票的价格上涨或下降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. JZ-011-二进制中 1 的个数

    二进制中 1 的个数 题目描述 输入一个整数,输出该数32位二进制表示中1的个数.其中负数用补码表示. 题目链接: 二进制中 1 的个数 代码 /** * 标题:二进制中 1 的个数 * 题目描述 * ...

  2. [k8s] k8s基于csi使用rbd存储

    描述 ceph-csi扩展各种存储类型的卷的管理能力,实现第三方存储ceph的各种操作能力与k8s存储系统的结合.通过 ceph-csi 使用 ceph rbd块设备,它动态地提供rbd以支持 Kub ...

  3. How to use Remote-SSH in Windows

    对于不太会使用 Vim 的我来说,在服务器上用 Vim 去修改 nginx.conf 实在有点麻烦,比如没有高亮和格式化.正好想起前不久微软发布了远程开发工具包,其中一个就是今天要介绍的 Remote ...

  4. 震撼的Linux全景图:业界成熟的内核架构长什么样?

    1)Linux怎么来的? Linus 为了方便访问大学服务器中的资源 ,在自己的机器上写了一个文件系统和硬盘驱动,这样就可以把自己需要的资源下载到自己的机器中.随后linus把这款操作系统雏形开源,成 ...

  5. 矩池云上编译安装dlib库

    方法一(简单) 矩池云上的k80因为内存问题,请用其他版本的GPU去进行编译,保存环境后再在k80上用. 准备工作 下载dlib的源文件 进入python的官网,点击PyPi选项,搜索dilb,再点击 ...

  6. 函数式组件中实现Antd打开Modal后其Input框自动聚焦(focus)到文字的最后

    目前React使用函数式组件已经成为趋势, 如何把React函数式组件用好, 提高性能, 从而实现业务需求也成为了一种能力的体现......咳咳咳, 进入正题: 现实场景需求 我想实现这一个需求, 父 ...

  7. Linux网卡ifcfg-eth0配置详解

    DEVICE="eth1"                              网卡名称 NM_CONTROLLED="yes"            n ...

  8. 【爬虫】python爬虫

    爬虫章节 1.python如何访问互联网 URL(网页地址)+lib=>urllib 2.有问题查文档:python document. 3.response = urllib.request. ...

  9. Laravel-AJAX-分页

    public function show(Request $request){ $posts = DB::table('posts') ->join('cate','posts.cate_id' ...

  10. LGP6156题解

    真·简单题 题目大意 给定 \(n\) 和 \(k\),求出这个柿子的值: \[\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\mu^2(\gcd(i,j)gcd(i,j) \] 按照 ...