Head First设计模式C++实现--第二章:观察者(Oserver)模式

head first 设计模式-C++实现.zip head first设计模式,原书用java实现的代码,这里是用C++实现的demo,包含所有章节的设计模式的C++代码的实现; 立即下载

观察者(Oserver)模式

一、问题的提出

第三方提供了一个类WeatherData,提供的getXXX方法可以取得三个测量值:温度、湿度和气压,每当数据准备好便调用measurementsChanged()方法。现在需要我们实现三个布告板:“目前状况”布告、“气象统计“布告、“天气预报”布告。一旦WeatherData有新的测量,这些布告必须马上更新。(此系统必须可以扩展,让其他开发人员建立定制的布告板,用户可以随心所欲添加或删除任何布告板)
WeatherData接口:
根据要求,可能会有如下实现:
void measurementChanged()
{
float temp = getTemperature();
float humidity = getHumidity();
float pressure = getPressure();

currentConditionDisplay.update(temp, humidity, pressure);
statisticsDisplay.update(temp, humidity, pressure);
forecastDisplay.update(temp, humidity, pressure);
}
缺点:针对具体实现编程,会导致我们以后在增加或删除布告时必须修改程序。

二、认识观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当这个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
定义观察者模式:类图
当两个对象之间松耦合,它们之间依然可以交互(传递数据),但是不清楚彼此实现的细节。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。改变主题或者观察者其中一方,并不会影响另一方。因为两者是松耦合的,所以
只要他们之间的接口被遵循,我们就可以自由地改变他们。

三、设计气象站


四、实现气象站

头文件:
#ifndef OBSERVER__H
#define OBSERVER__H
#include <vector>
#include <iostream>
using namespace std;

class Observer
{
public:
	virtual void update(float temp, float humidity, float pressure) = 0;
	void display();	//当布告牌需要显示时调用
};

class Subject
{
public:
	virtual void registerObserver(Observer* o) = 0;	//添加观察者
	virtual void removeObserver(Observer* o) = 0;	//删除观察者
	virtual void notifyObserver() = 0;				//通知所有观察者
};

class WeatherData : public Subject
{
private:
	vector<Observer*> m_observers;
	float temp;
	float humidity;
	float pressure;

public:
	WeatherData();
//	~WeatherData();

	void registerObserver(Observer* o);
	void removeObserver(Observer* o);
	void notifyObserver();
	
	void measurementsChanged();
	void setMeasurements(float temp, float humidity, float pressure);
};

class CurrentConditionsDisplay : public Observer
{
private:
	float temp;
	float humidity;
	Subject* weatherData;
public:
	CurrentConditionsDisplay(Subject* weatherData);
	void update(float temp, float humidity, float pressure);
	void display();
};

#endif
cpp文件
#include "Observer.h"

WeatherData::WeatherData()
{

}

void WeatherData::registerObserver(Observer *o)
{
	m_observers.push_back(o);
}

void WeatherData::removeObserver(Observer *o)
{

}
void WeatherData::notifyObserver()
{
	for(vector<Observer*>::iterator it=m_observers.begin(); it!=m_observers.end(); ++it)
	{
		Observer* ob = *it;
		ob->update(temp, humidity, pressure);
	}
}

void WeatherData::setMeasurements(float temp, float humidity, float pressure)
{
	this->temp = temp;
	this->humidity = humidity;
	this->pressure = pressure;

	notifyObserver();
}


CurrentConditionsDisplay::CurrentConditionsDisplay(Subject* weatherData)
{
	this->weatherData = weatherData;
	weatherData->registerObserver(this);
}

void CurrentConditionsDisplay::update(float temp, float humidity, float pressure)
{
	this->temp = temp;
	this->humidity = humidity;
	display();	//把温度和湿度保存起来,再调用display()
}

void CurrentConditionsDisplay::display()
{
	cout<<"Current conditions: "<<temp<<" F degrees and " << humidity << "% humidity"<<endl;
}

测试代码:
#include "Observer.h"

int main()
{
	WeatherData wd;
	CurrentConditionsDisplay* ccd = new CurrentConditionsDisplay(&wd);
	wd.setMeasurements(33.2, 22.1, 53.2);
	wd.setMeasurements(1.1, 2.2, 3.3);
	wd.setMeasurements(3.2, 1.3, 5.5);
	delete ccd;
	getchar();
}
代码中只实现了一个布告牌。后面要添加的布告牌只要实现接口即可。

四、总结

针对接口编程,尽可能的封装。

【LaTeX】IEEE会议模板中使用BibTex插入文献(解决报错:Something‘s wrong--perhaps a missing \item. \end{thebibliography} 使用IEEE会议论文LaTeX模板时遇到的一个错误,问题描述为:使用Texstudio编译LaTeX模板报错,报错信息提示为。出现的原因为IEEE会议论文模板自带的参考文献引用方式为手动插入,即不使用格式的参考文献,手动将参考文献调整为合适格式,然后粘贴到文本中,我准备将其换成方法引用参考文献。我的替换步骤为删除原始参考文献对应内容,即模板中的: 将以下函数添加到原始参考文献对应位置,对应上文新建的文件。 再次编译出现报错 删除文件夹中的文件 修改模板中的引用名称 引用方法为: 将 替换为 再次编译—— 阅读详情

相关推荐

手把手教你用ADS和CGH40010F模型搭建Doherty功放仿真原型(附工程文件)

本文详细介绍了如何使用ADS软件和CGH40010F GaN器件模型搭建Doherty功放仿真原型,涵盖工程准备、关键电路模块实现、效率优化技巧及常见问题排查。通过实战指南和效率优化技巧,帮助工程师快速掌握Doherty功放设计,提升5G基站和广播发射系统的功率放大器性能。

weixin_26897585的博客 344

Head First C 电子书pdf下载

嗨翻C语言(英文)下载链接: https://pan.baidu.com/s/1TtMF1vlQKg15ofbbq9Q4QA 提取码获取方式:关注下面微信公众号,回复关键字: 1141

欢迎关注微信公众号:DroidMind 2263

测站坐标系、地心非惯性系、经纬高互转

目录 一、经纬高转直角坐标系互转 1.1 python代码 二、wgs84转cgcs2000的转换矩阵如下 虽然cgcs2000与wgs84差别很小,但是我比较较真,还是做了两个坐标系的转换。 一、经纬高转直角坐标系互转 此处可参考链接(百度文库用手机浏览器可以打开看全部的): (1)第四章地球椭球及其数学详解 (2)第四章椭球数学变换16节 (3)大地测量学基础[1](7)(控制) 转换公式如下: LBH转XYZ: a为半长轴,e为偏心率 XYZ转LBH: a为半长轴

${王小贱}的博客 2万+

《headfirst设计模式》读书总结-包含C++代码

背景介绍: 假期期间阅读《HeadFirst设计模式》这本书,这本书写的很不错,内容生动不枯燥非常适合新手学习设计模式。在阅读之后我便写下了这本书的读书笔记,并将部分java代码用C++进行实现,感觉收获很多。 GitHub网站上我放有java代码、C++代码和书本的pdf 有兴趣的同学可以进行观看 GitHub:https://github.com/fightingzxd/HeadFirst 下面是我对每一章进行的总结,方便我日后进行复习,有兴趣的同学也可以看一下哟!链接如下: 《headfirst

qq_46470984的博客 1247

【SAM2系列】windows单GPU复现时的bug解决记录

windows运行sam2,就感觉在开一艘破破烂烂的船,每走一步报一个错,bug源源不断的冒出来😭😭😭😭😭。

weixin_43571113的博客 1317

硬件笔记——HDMI接口

HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。

2501_94625908的博客 537

C++HeadFirst:第一章-设计模式入门

我们知道duck类中的fly()和quack()会随着鸭子的不同而改变。为了把这两个行为从duck类中分开,我们建立新的类来代表不同的行为。将特定的行为实现在特定的类中。这样的设计,让这些行为与鸭子类无关,同时不同的行为也有了实现,提高了代码的复用。设计原则:找出应用中可能需要变化的部分,把不变和要变的部分分离独立出来。eg:假设有一个抽象类Animal,有两个具体的实现类Dog和Cat继承该抽象类。把会变化的部分取出并“封装”起来,好让其他部分不会受到变化的影响。一只具体的鸭继承Duck类和行为类即可。

lichengyang的博客 131

基于深度强化学习的柔性作业车间动态调度

在追求敏捷和灵活的生产调度方面,处理不可预测的动态事件的能力变得越来越重要。与此同时,生产系统中的网络-物理融合产生了大量需要实时挖掘和分析的工业数据。为了便于这种实时控制,本研究提出了一种分层分布式的体系结构来解决动态柔性作业车间调度问题。采用双深度Q网络算法(DDQN)训练调度智能体,捕捉生产信息与调度目标之间的关系,为具有恒定任务到达的柔性作业车间实时做出调度决策。为了处理动态调度中问题的可变规格说明,提出了专门的状态和动作表示法。此外,还提出了一种代理奖励整形技术(surrogate reward

太剧烈的快乐与太剧烈的悲哀是有相同之点的——同样地需要远离人群! 1万+

基于C++的《Head First设计模式》笔记——观察者模式

本文介绍了观察者模式在气象监测系统中的应用。作者使用C++和Qt框架重构了《Head First设计模式》中的Java示例,通过WeatherData类实现气象数据监测,并构建了当前状况、统计和预报三个显示组件。文章详细讲解了观察者模式的核心概念,包括主题(Subject)和观察者(Observer)接口的设计与实现,以及如何通过松耦合方式实现对象间通信。特别展示了Qt信号槽机制与观察者模式的关系,并通过lambda表达式优化代码结构等等。

Yu_Lijing的博客 1019

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 355

ROS局部路径规划器插件teb_local_planner流程梳理(上)

在我之前的文章《ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理》中已经介绍过Move_base节点调用局部路径规划器插件的接口函数是computeVelocityCommands,接下来,我们就从这个函数入手梳理一下teb_local_planner功能包的工作流程。

慕羽★的博客 5165

设计模式之----观察者模式

设计模式之----观察者模式 1.观察者模式概要 观察者模式又称为发布/订阅(Publish/Subscribe)模式,因此我们可以用报纸期刊的订阅来形象的说明: 报社方负责出版报纸. 你订阅了该报社的报纸,那么只要报社发布了新报纸,就会通知你,或发到你手上. 如果你不想再读报纸,可以取消订阅,这样,报社发布了新报纸就不会再通知你. 理解其实以上的概念,就可以理解观察者模式,观察者模式中有主题(S...

Hyutao的博客 303

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《Head First 设计模式》C++实现【观察者模式(Observer Pattern)】

《Head First 设计模式》书中第2章——观察者模式(Observer Pattern)的C++代码实现。

Liber-coder的博客 306

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++设计模式--观察者模式详解(head first 设计模式C++实现)

head first 设计模式 C++实现

qq_42292775的博客 446

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++设计模式--迭代器模式组合模式解析(head first 设计模式C++实现)

【代码】C++设计模式--迭代器模式组合模式解析(head first 设计模式C++实现)

qq_42292775的博客 486

【设计模式】Head First 设计模式——构建器模式 C++实现

Builder 模式主要用于“分步骤构建一个复杂的对象”。在这其中“ 分步骤 ”是一个稳定的算法,而复杂对象的各个部分则经常变化变化点在哪里,封装就在哪里 — Builder 模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动在Builder 模式中,要注意不同语言中构造器内调用抽象方法的差别。

Friday 1177

C++设计模式--状态模式解析(head first 设计模式C++实现)

【代码】C++设计模式--状态模式解析(head first 设计模式C++实现)

qq_42292775的博客 566

Head First 设计模式-C++实现---观察者模式

1.意图 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 2. 别名 依赖(Dependents),发布-订阅(Publish/Subscribe)模式; 3.动机: 降低各类紧密耦合; Head First设计模式上的观察者模式使用java语言实现,这里用C++语言来实现: Su...

u010096608的博客 558

HeadFirst设计模式之策略模式(C++实现)

设计模式入门 1. 设计原则 找到应用中可能变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 把会变化的部分取出并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分。 针对接口(Interface)编程,而不是针对实现(implenments)编程。 多用组合,少用继承。 如同书上所说,鸭子的行为不是(IS-A)继承extends而来的,而是通...

Xavier丶 520

C++设计模式--装饰者模式解析(head first 设计模式C++实现)

C++设计模式-装饰者模式解析(head first 设计模式C++实现)

qq_42292775的博客 468

C++设计模式--命令模式解析(head first 设计模式C++实现)

C++设计模式--命令模式解析(head first 设计模式C++实现)

qq_42292775的博客 386

【设计模式】Head First 设计模式——抽象工厂模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。

Friday 936

【HeadFirst 设计模式】命令模式的C++实现

A公司想要生产一款万能遥控器:使用本公司遥控器,只需要设置好需要被控制的设备,比如电视,空调,电灯等,便可以实现遥控,从此摆脱找不到遥控器的情况!其他电器类的代码和实现已经相应的电器公司提供,你的任务是将这些代码融合进遥控器中,以实现遥控器的功能。

Friday 667

C++设计模式--单例模式解析(head first 设计模式C++实现)

【代码】C++设计模式--单例模式解析(head first 设计模式C++实现)

qq_42292775的博客 504

《Head First 设计模式》例子的C++实现(10 状态模式)

#《Head First 设计模式》例子的C++实现(10 状态模式) 状态机应用的也很广泛,只不过我们通常都是用一个变量来标志状态,然后用一个大的switch case 结构来处理各个状态。这种写法的缺点就是这个 switch case 会越来越大,越来越难维护。 状态模式则是将各个状态都抽象成了独立的类。每个类只要关心当前状态要处理的事情就可以了,所以简化了代码。缺点也很明显,每个状态建一个类...

Ivan 的专栏 880

Head First 设计模式(C++实现):组合模式:Compisite

组合模式:允许你将对象组成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致性的方式处理个别对象和对象组合。 类图如下: 更为形象的表示如下: 代码如下: /*MenuComponent.h*/ #pragma once #include "UnsupportedOperationException.h" #include &lt;string&gt; class Men...

WJsuperrunner 382
上一篇: Head First设计模式C++实现--第一章:策略模式
下一篇: Head First设计模式C++实现--第三章:装饰者(Decorator)模式
FightForProgrammer
博客等级 码龄13年 239粉丝 75原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值