zoukankan      html  css  js  c++  java
  • 软件设计观察者模式

    股票提醒
    当股票的价格上涨或下降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();
    }

    运行截图

  • 相关阅读:
    通过结构体某个成员的地址计算结构体首地址 (转)
    2019.9.2课程设计报告
    2019.9.1课程设计报告
    2019.8.31课程设计报告
    2019.8.30课程设计报告
    2019.8.29课程设计报告
    2019.8.28课程设计报告
    2019.8.27课程设计报告
    2019.8.26课程设计报告
    2019.8.25课程设计报告
  • 原文地址:https://www.cnblogs.com/Arisf/p/15685726.html
Copyright © 2011-2022 走看看