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

jhcelue jhcelue     2022-08-31     348

关键词:

今天白天主要看了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点起床了。已经刷完牙啦。准备睡觉。各位看官都这个点了,早点睡吧,我去睡觉了,晚安~













































设计模式——建造者模式

...种。结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式,共7中。行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式... 查看详情

设计模式简述

 1、外观模式:UML图: 说明:通过在必需的逻辑和方法的集合前创建简单的外观接口,外观设计模式隐藏了调用对象的复杂性。外观设计模式和建造者模式非常相似,建造者模式一般是简化对象的调用的复杂性,外观模... 查看详情

编程经常使用设计模式具体解释--(上篇)(工厂单例建造者原型)

...型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模 查看详情

java中23种设计模式(附代码样例)

...型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模... 查看详情

建造者模式

文章目录​​一,建造者模式​​​​1.什么是建造者模式​​​​2.建造者模式几大角色​​​​抽象模型和具体实现模型​​​​抽象和具体建造者​​​​导演​​​​3.建造者模式应用场景​​​​1.何时使用​​​​2.... 查看详情

建造者模式(builder)

建造者模式(Builder)C#设计模式系列:建造者模式(Builder)建造者模式(BuilderPattern) 状态模式C#设计模式——状态模式(StatePattern) 查看详情

设计模式——建造者模式

设计模式(五)——建造者模式一、建造者模式简介1、建造者模式简介    建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。    建造者模式和抽象工厂模式... 查看详情

设计模式之建造者模式(创建型)(代码片段)

模式定义建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法。所谓建造者模式就是将组件和组件的组件过程分开,然后一步一步建造一个复杂的对象。所以建造者模式又叫生成器模式。建造者... 查看详情

设计模式之————建造者模式

建造者模式1.什么是建造者模式?建造者模式属于创造型模式,它是将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。举例:普通房子和高楼,两者都很难建造,但也有相似点:打地... 查看详情

设计模式建造者模式(简介|适用场景|优缺点|代码示例)(代码片段)

文章目录一、建造者模式简介二、建造者模式适用场景三、建造者模式优缺点四、建造者模式与工厂模式五、建造者模式代码示例1、学生类2、建造者抽象类3、建造者实现类4、教师类(非必须)5、测试类六、实例类和建造者类定... 查看详情

《大话设计模式》——建造者模式

建造者模式结构图角色:1、builder:建造者接口。定义了建造一个产品所必须的所有流程。所有的建造者都需要实现该类,以确保实现建造一个产品所需的流程。2、concreteBuilder:具体建造者。每一个建造者,可以创建一种产品,... 查看详情

设计模式—建造者模式(builder)(代码片段)

title:设计模式—建造者模式建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。我们获得一... 查看详情

设计模式之建造者模式

1定义建造者模式(BuilderPatten):将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式用于一步一步创建一个复杂的对象,他允许用户只通过指定复杂对象的类型和内容进行构建,用户... 查看详情

设计模式建造者模式

建造者模式建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在建造事物时,如果发现事物的内部建造的顺序是保持不变的,并且多个事物之间的建造过程也是一致的那么就可以使... 查看详情

java设计模式-建造者模式

建造者模式概述建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如... 查看详情

大话设计模式-建造者模式(代码片段)

建造者模式建造者模式又称生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式主要用于创建一些复杂的对象,这些对象内部构构建间的构造顺序通常是稳定的,但对象内... 查看详情

设计模式:学习笔记——建造者模式

设计模式:学习笔记(4)——建造者模式概述建造者模式  建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只... 查看详情

建造者模式

建造者模式的定义建造者模式(BuilderPattern)也叫做生成器模式,其定义如下:Separatetheconstructionofacomplexobjectfromitsrepresentationsothatthesameconstructionprocesscancreatedifferentrepresentations.(将一个复杂对象的构建与它的表示分离,使得同样... 查看详情