设计模式一(续)

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

为什么要写这一篇呢:

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相同了。这种写法和之前那篇文章的写法的区别之一就是 本文所用变量皆为局部变量。

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

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

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

时间: 2024-11-16 14:38:48

设计模式一(续)的相关文章

设计模式 &ldquo;续&rdquo;

观察者模式 再次申明,本文学习自 程杰 兄的 "大话设计模式" 根据书中的内容和自己的体会而来. 观察者模式也叫 发布.订阅模式,在这个模式里,一个目标物件管理所有依赖它的观察者物件,在本身状态更改时发出通知,通知将被观察者接收到. 书中用例子 炒股 来形容了这一点,在炒股的同事是观察者,依赖于前台妹子.当老板来的时候向炒股的同事发出通知,但是问题是 前台妹子与炒股的同事耦合在一起,这并不符合依赖倒置原则.所以把发布者与观察者都进行抽象,它们都依赖于抽象,这样就解开了之间的关系. 解决

设计模式:工厂模式(续:虚构造函数和抽象工厂)

在之前的<设计模式:工厂模式>中记录了两种用于创建派生类对象的工厂模式,第一种模式直接使用基类的静态成员函数来创建派生类的对象,在该静态成员函数中直接调用了派生类的构造函数,第二种模式是使用基类工厂的静态成员函数,通过基类工厂中保存的各派生类工厂来创建派生类对象,派生类工厂是派生类的嵌套类,相当于为派生类量身定做的专属工厂,这些专属工厂的存在使得基类工厂不必了解创建派生类对象的细节.今天主要记录另外两种工厂模式:虚构造函数和抽象工厂.虚构造函数模式与前两种工厂模式不同,在前两种工厂模式中,基类

设计模式(1):只执行一次的函数(续)

概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. 闭包之殇 本来上篇写的好好地,看起来逻辑也很清晰,但是实际用起来发现了一个巨大的坑.那就是,闭包中的变量将会共享!!! // utils.js export function runOnce(func) { let runOnce = true; return function(params) { if (runOnce) { func.apply(this, par

akka设计模式系列-消息模型(续)

在之前的akka设计模式系列-消息模型中,我们介绍了akka的消息设计方案,但随着实践的深入,发现了一些问题,这里重新梳理一下设计方法,避免之前的错误.不当的观点给大家带来误解. 命令和事件 我们仍然把akka中的消息分为命令和事件两大类,但二者的具体含义和实现有一点变化.“命令,是指一个actor给另外一个actor发送指令做相关的业务逻辑:事件,则是actor对某个命令的响应结果,或者对其他事件的响应结果”.之前是这样定义的,但在具体的实践过程中发现了一些问题. 比如,命令如何归类?是根据命

从引用传递到设计模式(续)

上一篇文末,提到非虚拟接口 NVI 的实现,即将虚函数声明为保护型或私有型,借由模板函数模式来实现 . 园友 @KillU 看的很仔细,提出了一个问题:虚函数是 private 类型,继承可以么? 答案是:完全可以 5  实现权和调用权 <Effective C++> 中给的解释是: 重写一个虚函数,指的是如何做事情 (how), 而调用一个虚函数,指的是什么时候做事情 (when) NVI 或 模板函数模式中,允许派生类重写虚函数,赋给派生类的是“实现权” - 即函数功能的实现:但是基类仍然

单例设计模式续--有上限的多例设计

package Singleton_Pattern; import java.util.ArrayList; import java.util.Random; //让一个类最多产生指定数量的对象,即有上限的多例模式 public class demo3 { public static void main(String[] args) { int ministerNum = 5; for(int i=0;i<ministerNum;i++){ Emperor2 emp = Emperor2.get

DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)

背景: 上周通过单步调试,找出了开源库mDCM与DCMTK在对DICOM图像进行JPEG无损压缩时的细小区别,并顺利实现了在C++和C#环境下对DICOM图像的压缩.但是问题接踵而至啊,随着项目的深入,发现在单独的测试工程中可以实现的mDCM版本,在嵌入到项目整体中后,却意外地出现了错误,并未顺利实现DICOM图像的JPEG无损压缩.因此需要继续详细对比分析mDCM与DCMTK两者,期望寻找原因. 问题分析: 开启项目的日志功能后,得到的信息反馈为: No registered codec fo

24种设计模式--模版方法模式【Template Method Pattern】

周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心做好,我们一定要…(中间省略 20 分钟的讲话,如果你听过领导人的讲话,这个你应该能够续上)”动员工作做完了,那就开始压任务了,“这次时间是非常紧张的,只有一个星期的时间,小三,你负责在一个星期的时间把这批 10 万车模(注:

云计算设计模式(十三)——领导人选举模式

云计算设计模式(十三)——领导人选举模式 通过协调合作,在分布式应用程序的任务实例集合执行的操作,选举一个实例作为承担管理的其他实例责任的领导者.这个模式可以有助于确保任务实例不互相冲突,导致争用共享资源,或与其他的任务实例正在执行的工作无意中干扰. 背景和问题 一个典型的云应用包括行动协调的方式很多任务.这些任务都可以是实例运行相同的代码和需要访问相同的资源,或者它们可能是可并行工作,以执行复杂计算的各个部分. 任务实例可能为多的时间自主运行,但它也可能是必要的,以协调各实例的操作,以确保它们