今天白天主要看了boost库的应用,主要是经常使用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模式。主要就是外观模式。建造者模式和观察者模式。我们从boost简要说起。

事实上boost的库好多东西在c++11里面已经有了。比方bind,仅仅只是boost的库的bind比c++11用着感觉要方便。事实上有些东西我自己由于也没实用c++做过什么大的项目。所以不敢乱说,仅仅敢说点建议性的,关于bind就是绑定函数吧。这个。

。比方一个函数原型是这样void fun(int a,int b),我们就能够用boost再绑定一下,比方第2个參数我们固定为100。那么就能够这么写boost::function<void(int,int)> fun1 = boost::bind(fun,_1,100)。这样我们就成功的通过function和bind联合起来用,来绑定了。我们这里说的是一个定值。事实上这里全然能够依据业务需求来换成一个不定的值。

接下来说说regex,这个是今天最头疼的问题,不是由于正則表達式难,正則表達式在曾经我做java的时候用过。感觉还不错啊。可是boost,c++的语法今天实在是令我淡疼,所以我就想,就先这么肤浅的用着吧。有项目要用的时候我们在深入一下也不迟,boost::regex_match这个函数主要是所有匹配匹配整个串,boost::regex_search这个函数能够实现匹配部分哦,比方192.168.0.1。我们能够通过"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"。来匹配出数字啊。结果自然就存在boost::smatch里面啦,另一个boost::regex_replace,这个替换完的会通过返回值返回回来的。

还有thread。事实上c++11就是抄的boost的thread,他俩大同小异。大家能够借助文档啦。

还有智能指针,智能指针大体有3种,scoped,shared,weak,细分的话就是scoped_ptr,scoped_array,同理shared也是,weak仅仅有weak_ptr,scoped的意思就是我们分配了就仅仅能是我自己指向这块内存。不能拷贝赋值,shared能够拷贝赋值。weak_ptr是一个弱引用。为什么说是弱引用呢,事实上并不改动该对象的引用计数。

若引用能够防止内存泄露,不要觉得仅仅能指针就不会内存泄露,c++的内存泄露也是偶尔会存在智能指针里的,举个栗子:

#include <iostream>
#include <boost/smart_ptr.hpp>using namespace std;class Parent;
class Children;class Parent
{
public:Parent(){cout << "parent create" << endl;}~Parent(){cout << "parent destroy" << endl;}boost::shared_ptr<Children> c;
};class Children
{
public:Children(){cout << "children create" << endl;}~Children(){cout << "children destroy" << endl;}boost::shared_ptr<Parent> p;
};void test()
{boost::shared_ptr<Parent> p(new Parent);boost::shared_ptr<Children> c(new Children);p->c = c;c->p = p;
}void main()
{test();cin.get();
}

这不就内存泄露了吗。Parent里有指针指向Children。Children内部有指针指向Parent,这俩就在这循环着,谁也不释放内存,假设想结局这个问题。我们就要用到weak_ptr,仅仅要我们将当中一个对象内部的指针从shared_ptr改为weak_ptr就能够了,所以说我们编程的时候,一定要有这个意识。智能指针也会内存泄露。

ref就是一个包装的引用,有的时候我们不能拷贝复制,由于有的时候传參是拷贝传參的,所以这个时候我们就要用到了ref。

unordered里主要是由unordered_map,unordered_mutlimap,unordered_set,unordered_mutliset。他们内部结构都是哈希,查找的时间复杂度为O(1),这个是boost帮我们实现的了。

-----------------------------------------------------------------------------------------------------------切割线-------------------------------------------------------------------------------------------------------------------

以下是设计模式了

外观模式:上图:

这个外观模式的精髓就在于Facade这个类实现的分离。

外观模式就是给client暴露的接口非常少。真正复杂的业务逻辑我们全都缴费Facade和SubSystem来交互。

应用场景:

首先,在设计初期阶段,应该要有意识将不同的两个层分离,,层与层之间建立外观Facade,
其次。在开发阶段,子系统往往由于不断的重构演化而变得越来越复杂。添加外观模式,降低依赖。
第三,维护一个一流的大型系统的时候,可能这个系统已经很难以维护和扩展了,就要改动设计,让新系统与Facade对象交互。Facade与遗留代码交互全部复杂工作。
MVC不就是採用的这个模式吗.分层思想。

。。

建造者模式:上图。
这个建造者模式的精髓主要用于创建一些复杂的最想。这些对象内部构建间的建造顺序一般是稳定的,但对象内部的构建通常面临着复杂的变化。
这个内部非常复杂。可是这些东西都是Director来做的。Client不用管,Client管的就是依照接口一个一个的把方法实现即可了,然后用Director来创建对象,最后产品就出来了。
优点:使建造代码与表示代码分离。因为建造者隐藏了该产品是怎样组装的,所以假设须要改变一个产品的内部表示。仅仅须要再定义一个详细的建造者就能够了。

所以说,建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时使用的模式.

事实上我们在android里的AlertDialog.Builder不也非常相似吗,我们没有关注细节,最后build除了那个dialog

建造者模式代码:
#include <iostream>using namespace std;class Product
{
public :char *head = nullptr;char *body = nullptr;friend ostream & operator<<(ostream & os, Product & pro){os << pro.head << "   " << pro.body;return os;}
};class Builder
{
protected:Product *p = nullptr;
public:Builder(){p = new Product;}~Builder(){delete p;}
public:virtual Product & getResult(){return *p;}virtual void buildPartA() = 0;virtual void buildPartB() = 0;
};class BuilderA : public Builder
{
public:virtual void buildPartA() override{p->head = "大头";}virtual void buildPartB() override{p->body = "金身";}
};class BuilderB : public Builder
{
public:virtual void buildPartA() override{p->head = "小头";}virtual void buildPartB() override{p->body = "測试";}
};class Director
{
public:void build(Builder & b){b.buildPartA();b.buildPartB();}
};void main_jianzao()
{Builder *b1 = new BuilderA;Builder *b2 = new BuilderB;Director dir;dir.build(*b1);dir.build(*b2);Product &p1 = b1->getResult();Product &p2 = b2->getResult();cout << p1 << endl;cout << p2 << endl;cin.get();
}

观察者模式:上图:
今天晚上用c++调了半天,最后还是有点小问题。明天再调吧,今天实在是困得不行不行了。
我们说完,观察者模式就是我们常说的监听。事实上监听器就是依据这个模式来的。
当一个对象的改变须要同一时候改变其它对象的时候就须要我们考虑用观察者模式了,
并且他不知道详细有多少对象有待改变的时候,应该考虑使用观察者模式。

观察者模式所做的工作就是在解除耦合.让耦合两方都依赖于抽象,而不是依赖于详细,从而使得各自的变化都不会影响还有一边的变化.

观察者模式代码例如以下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/smart_ptr.hpp>
#include <memory>using namespace std;class Observer;
class TongshiA;
class TongshiB;
class Event;
template<class T>
class AbstractSubject;class Secretary;
class Boss;class Event
{
public:string type = nullptr;string content = nullptr;Event(){}Event(string &type, string & content) :type(type), content(content){}
};template<class T>
class AbstractSubject
{
protected:vector<T *> *obsevers = nullptr;public:virtual void attch(T * p){obsevers->push_back(p);}virtual void detach(T * p){remove(obsevers->begin(), obsevers->end(), p);}virtual void notifyall() = 0;AbstractSubject(){obsevers = new vector<T*> ;}~AbstractSubject(){delete obsevers;}};class Observer
{
public:const char *name;Observer(const char *name) :name(name){}virtual void update(Event & e){cout << "消息内容:" << e.content.c_str() << endl;}
};class TongshiA : public Observer
{
public:TongshiA(const char * name) :Observer(name){}virtual void update(Event & e) override{cout << "消息内容:" << e.content.c_str() << endl;if (strcmp(e.type.c_str(), "警报") == 0){cout << "关闭游戏,继续工作" << endl;}else{cout << "反正老板也没回来,去刷副本" << endl;}}
};class TongshiB : public Observer
{
public:TongshiB(const char *name) :Observer(name){}virtual void update(Event & e) override{cout << "消息内容:" << e.content.c_str() << endl;if (strcmp(e.type.c_str(), "警报") == 0){cout << "最小化股票,好好工作" << endl;}else{cout << "和同事还能聊会儿天" << endl;}}
};class Secretary : public AbstractSubject<Observer>
{
public:virtual void attch(Observer * t){obsevers->push_back(t);}virtual void detach(Observer * t){remove(obsevers->begin(), obsevers->end(), t);}virtual void notifyall() override{for_each(obsevers->begin(), obsevers->end(), [&](Observer * obs){string s1("警报");string s2("老板来了");Event e(s1, s2);obs->update(e);});}
};class Boss : public AbstractSubject < Observer >
{
public:virtual void attch(Observer * t){obsevers->push_back(t);}virtual void detach(Observer * t){remove(obsevers->begin(), obsevers->end(), t);}virtual void notifyall() override{for_each(obsevers->begin(), obsevers->end(), [&](Observer * obs){string s1("正常");string s2("老板出去了");Event e(s1,s2);obs->update(e);});}
};void main()
{AbstractSubject<Observer> *sec = new Secretary;Observer *a = new TongshiA("tongshia");Observer *b = new TongshiB("tongshib");sec->attch(a);sec->attch(b);AbstractSubject<Observer> *boss = new Boss;boss->attch(a);boss->attch(b);sec->notifyall();cout << "---------------------------------" << endl;boss->notifyall();cin.get();
}

实在是困了,这了快2点了,明天正常的话要7点多起床。看来要8点起床了。已经刷完牙啦。准备睡觉。各位看官都这个点了,早点睡吧,我去睡觉了,晚安~

2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用相关推荐

  1. 设计模式 — 创建型模式 — 建造者模式

    目录 文章目录 目录 建造者模式 应用场景 代码示例 建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修 ...

  2. 设计模式-创建型模式-建造者模式

    设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...

  3. 《设计模式详解》创建型模式 - 建造者模式

    建造者模式 4.4 建造者模式 4.4.1 概述 4.4.2 结构 4.4.3 实例 4.4.4 优缺点 4.4.5 使用场景 4.4.6 扩展 - 构建对象 重构前 重构后 4.5 创建型模式对比 ...

  4. 重学Java设计模式-创建者模式-建造者模式

    重学Java设计模式-创建者模式-建造者模式 内容摘自:重学 Java 设计模式:实战建造者模式「各项装修物料组合套餐选配场景」 | bugstack 虫洞栈 建造者模式介绍 图片来自:https:/ ...

  5. 【设计模式】(八)--创建型模式--建造者模式

    [设计模式](八)–创建型模式–建造者模式 建造者模式 [设计模式](八)--创建型模式--建造者模式 建造者模式定义 构造者模式的优点 构造者模式的使用场景 构造者模式和工厂模式区别 构造者模式简单 ...

  6. 创建型设计模模式---建造者模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  7. 第三天:创建型模式--建造者模式

    零.建造者模式 什么是建造者模式 使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于建造者模式,它提供了一种创建对象的最佳方式,将一个复杂对象的构造过程与其表象分离,同一个构造过程 ...

  8. [19/04/24-星期三] GOF23_创建型模式(建造者模式、原型模式)

    一.建造者模式 本质:分离了对象子组件的单独构造(由Builder负责)和装配的分离(由Director负责),从而可以构建出复杂的对象,这个模式适用于:某个对象的构建过程十分复杂 好处:由于构建和装 ...

  9. 创造型模式——建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类会一步一步构造最 ...

  10. 23模式--建造者模式

    建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这种类型的设计模式属于创建型模式,它提供了一种某种情况创建对象的最佳方式. 其实无论前面的聊的单例 ...

最新文章

  1. Android -- TextView与EditText 同步显示
  2. 特斯拉AI总监用300行代码实现“迷你版GPT”,上线GitHub三天收获3.3k星
  3. Tensorflow学习资源
  4. 基本类型与字符串之间的转换
  5. 02-JDBC学习手册:JDBC编程步骤【重点重点】
  6. lin总线可以控制几个节点_汽车上除了CAN通讯还有另外一种总线你需要知道
  7. OpenCv学习笔记(二)—cv Mat学习
  8. python设计与调试[摘自笨方法学python]
  9. TOMCAT内存溢出问题
  10. android布局添加布局,Android中添加布局和初始化布局总结
  11. 如何在IIS添加MIME扩展类型
  12. 21.iozone的使用与介绍
  13. Photoshop提高照片对比度的几种实用方法
  14. 项目管理-----整合项目资源
  15. 聚类分析上证50成分股
  16. 如何获取filecoin_分析:如何捕获Filecoin的价值?
  17. ### LinuxCBT VBOX Edition ###
  18. JDBC 第一章 JDBC概述
  19. 项目:机器学习+FLD分类+python图像处理mnist数据集
  20. java的图片上传详解

热门文章

  1. ByteBuffer用法小结
  2. jquery生成一个li_jquery-创建元素和添加子元素
  3. python eel 多线程_利用Eel使JavaScript调用Python程序
  4. python如何复制一个变量_Python中变量、赋值、浅拷贝、深拷贝
  5. mysql insert 主键冲突_insert 时防止出现主键冲突错误的方法
  6. 底部分页栏_2020年执业药师考试教材各科目增加页数!最多203页
  7. python集合类型的操作符_Python 语言学习 第一篇:数据类型(数字,集合,布尔类型,操作符)...
  8. node服务器放vue项目,本地Vue项目跨域请求本地Node.js服务器的配置方法
  9. git 使用_Git使用总结
  10. cefsharp.wpf离线安装包下载_在vscode里编写c++程序(解决gdb下载失败问题)