首页 > 代码库 > 设计模式一(续)

设计模式一(续)

本篇是接着设计模一:观察者模式的续写。

为什么要写这一篇呢:

java在main函数里new出的对象都是局部变量,而用C++ 在main函数里new出来的都是 动态分配到堆区的。

那么可不可以按照java的思路来写呢。

这就是写本篇的原因了:C++完全可以按照java的思路来实现(使用引用)

附上代码:

#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Observer;
class Subject;
class Subject
{
public:
    Subject()
    {
        msg="orinal msg";
    }
    void add(Observer &ob)
    {
        vec.push_back(ob);
    }
    void show()
    {
        cout<<"broadcast:msg is:"<<msg<<endl;
    }
    void change(string msg)
    {
        this->msg=msg;
        notification();
    }
    void notification();
private:
    vector<Observer> vec;
    string msg; 

};
class Observer
{
public:
    Observer(Subject &sub):sub(sub)
    {

        this->sub.add(*this); //这里使用了*this  this指的是指向对象本身的指针,*this 指的是对象本身。
    }
    void Showdate()
    {
        sub.show();
    }
private:
    Subject &sub;
};
void Subject::notification()
{
        vector<Observer>::iterator v = vec.begin();
         while( v != vec.end()) {
             (*v).Showdate();
             v++;
      }
 }
int _tmain(int argc, _TCHAR* argv[])
{
    Subject sub= Subject();
    Observer ob1= Observer(sub);
    Observer ob2= Observer(sub);
    sub.change("asdasd");
    return 0;
}

这里使用了引用类型,引用类型 的格式 TYPE &A =XXX,之所以称为引用 指的就是该引用变量和变量本身是同一块内存单元。

这样就与JAVA相同了。这种写法和之前那篇文章的写法的区别之一就是 本文所用变量皆为局部变量。

之前的文章为什么要用指针呢,因为在传递参数时如果不用指针那么函数内部操作的实际上是局部变量(该程序对局部变量的操作没有意义)

而使用引用完全可以做的和指针相同的功能,区别只是内存分配的问题。

需要注意一点的是 如果类的成员变量是引用类型,那么引用类型只能用初始化表的形式初始化。

设计模式一(续)