自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(198)
  • 资源 (1)
  • 论坛 (7)
  • 收藏
  • 关注

原创 享元模式--结构型模式

1、描述2、结构图3、C++代码

2020-11-24 18:11:08 26

原创 状态模式--行为模式

1、描述状态是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为。该模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。2、结构图3、C++代码#include <iostream>#include <typeinfo>class Context;//状态基类声明了一些所有的具体状态类都需要实现的方法;并且提供了一个与状态关联的Context对象//的回溯引用。状态类使用该回溯引用转换到其他

2020-11-24 16:17:24 3

原创 访问者模式--行为模式

1、描述访问者是一种行为设计模式,允许你在不修改已有代码的清空下向已有类层次结构中添加新的行为。2、结构图3、C++代码#include <iostream>#include <string>#include <array>/** * The Visitor Interface declares a set of visiting methods that correspond to * component classes. The sig

2020-11-24 15:17:14 27

原创 备忘录模式--行为模式

1、描述备忘录是一种行为设计模式,允许生成对象状态的快照并在以后将其还原。备忘录不会影响它所处理的对象的内部结构,也不会影响快照中保存的数据。2、结构图3、C++代码#include <string>#include <iostream>#include <vector>#include <time.h>//备忘录接口提供了一种获取元数据的方法,例如创建日期或名称。但是,它不会暴露发起者的状态class Memento {

2020-11-24 13:50:13 2

原创 外观模式--结构型模式

1、描述外观是一种结构型设计模式,能为复杂系统、程序库或框架提供一个简单(但有限)的接口尽管外观模式降低了程序的整体复杂度,但它同时也有助于将不需要的依赖移动到同一个位置。2、结构图3、C++代码#include <string>#include <iostream>//外观类可以使用子系统,客户也可以直接使用子系统//对于子系统来说,外观类也是另一个客户,而不是子系统的一部分。class Subsystem1 { public: std::

2020-11-24 11:22:21

原创 观察者模式--行为模式

1、描述观察者是一种行为设计模式,允许一个对象将其状态的改变通知其他对象。观察者模式提供了一种作用于任何实现了订阅者接口的对象的机制,可对其事件进行订阅和取消订阅。2、结构图3、C++代码#include <iostream>#include <list>#include <string>class IObserver { public: virtual ~IObserver(){}; virtual void Update(c

2020-11-24 10:44:07

原创 组合模式--结构型模式

1、描述组合是一种结构型设计模式,你可以使用它将对象组合成树状结构,并且能向使用独立对象一样使用它们。对于绝大多数需要生成树状结构的问题来说,组合都是非常受欢迎的解决方案。组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。2、结构图Component:描述了树中简单项目和负责项目共有的操作 Leaf:树的基本结构,它不包含子项目。一般情况下,叶结点最终会完成大部分的实际工作,因为它们无法将工作指派给其他部分 Composite:包含叶节点或其他容器等子项目的单位。容器不

2020-11-24 10:02:34 1

原创 迭代器模式--行为模式

1、描述2、结构图3、C++代码

2020-11-24 09:09:48

原创 适配器模式--结构型模式

1、描述适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。2、结构图对象适配器实现时使用了构成原则:适配器实现了其中一个对象的接口,并对另一个对象进行封装。所有流行的编程语言都可以实现适配器。client是包含当前程序业务逻辑的类 Target描述了其他类与客户端代码合作时必须遵循的协议 Adaptee中有一些功能类,客户端与其接口不兼容,因此无法直接调用其功能 Adapter是一个可以同时与客户端与服务交互的类:它在实现客户端接口的同时封帐了服务对象...

2020-11-23 18:08:07 2

原创 策略模式--行为模式

1、描述策略是一种行为设计模式,它将一组行为转换为对象,并使其在原始上下文对象内部能够相互替换。原始对象被称为上下文,它包含指向策略对象的引用并将执行行为的任务分派给策略对象。2、结构图3、C++程序#include <string>#include <vector>#include <iostream>#include <algorithm>//策略抽象类声明了默写算法所有受支持版本的通用操作class Strategy

2020-11-23 16:44:53 2

原创 装饰模式--结构型模式

1、描述装饰是一种结构设计模式,允许你通过将对象放入特殊封装对象中来为原对象增加新的行为。由于目标对象和装饰器遵循同一接口,因此你可用装饰来对对象进行无限次的封装。结果对象将获得所有封装器叠加而来的行为。2、结构图3、C++代码#include <string>#include <iostream>//基础组件定义了可以被装饰器修改的操作class Component { public: virtual ~Component() {} virt

2020-11-23 15:21:20

原创 责任链模式--行为模式

1、描述责任链是一种行为设计模式,允许你将请求沿着处理者链进行发送,直至其中一个处理者对其进行处理。该模式允许多个对象来对请求进行处理,而无需让发送者类与具体接受者类相耦合。链可在运行时由遵循标准处理者接口的任意处理者动态生成。2、结构图3、C++代码...

2020-11-23 14:16:25

原创 命令模式--行为模式

1、描述命令是一种行为设计模式,它可将请求或简单操作转换为一个对象。此类转换让你能够延迟进行或远程执行请求,还可将其放入队列中。2、结构图3、C++代码#include <iostream>#include <string>//命令接口声明了一个执行命令的方法class Command { public: virtual ~Command() { } virtual void Execute() const = 0;};//一些.

2020-11-23 11:28:30

原创 中介者模式--行为模式

1、描述中介者是一种行为设计模式,让程序组件通过特殊的中介者对象进行间接沟通,达到减少组件之间依赖关系的目的。中介者能使得程序更易于修改和扩展,而且能更方便地对独立的组件进行复用,因为它们不再依赖于很多其他的类。2、结构图3、C++代码#include <iostream>#include <string>//中介者接口声明了一个能让组件将各种事件通知给中介者的方法。中介者可对这些事件//做出响应并将执行工作传递给其他组件class BaseCompo

2020-11-23 10:31:34

原创 原型模式--创建型模式

1、描述原型是一种创建型设计模式,使你能够复制对象,甚至是复杂对象,而又无需使代码依赖它们所属的类。所有的原型类都必须有一个通用的接口,使得即使在对象所属的具体类未知的情况下也能复制对象。原型对象可以生成自身的完整副本,因为相同类的对象可以相互访问对方的私有成员变量。2、结构图3、C++代码#include <string>#include <vector>#include <iostream>#include <unordered_ma

2020-11-23 09:14:14 49

原创 代理模式--结构型模式

1、描述代理是一种结构型设计模式,让你能提供真实服务对象的替代品给客户端使用。代理接收客户端的请求并进行一些处理(访问控制和缓存等),然后再将请求传递给服务对象。代理对象拥有和服务对象相同的接口,这使得当其被传递给客户端时可与真实对象互换。2、结构图Subject声明了服务接口,代理必须遵循该接口才能伪装成服务对象 RealSubject提供了一些实用的业务逻辑 Proxy包含了一个指向RealSubject对象的引用成员变量。代理完成其任务(例如延迟初始化、记录日志、访问控制和缓存

2020-11-23 08:23:41 2

原创 生成器模式--创建型模式

1、描述生成器模式是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。2、结构图生成器(Builder)接口声明在所有类型生成器中通用的产品构造步骤 具体生成器(ConcreateBuilder)提供构造过程的不同实现。具体生成器也可以构造不遵循通用接口的产品 产品(Product)是最终生成的对象。由不同生成器构造的参评无需属于同一类层次结构或接口 主管(Director)类定义调用构造步骤的顺序,这样你就可以创建和复用特定...

2020-11-23 08:21:38

原创 模板方法模式--行为模式

1、描述模板方法是一种行为设计模式,它在基类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。2、结构图抽象类(AbstractClass)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现 具体类(ConcreteClass)重写所有步骤,但不能重写模板方法自身。3、C++代码#include <iostream>#include <string>//抽象类定义了一个模

2020-11-23 08:20:34

原创 抽象工厂模式--创建型模式

1、描述抽象工厂模式是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。什么是“系列对象”?例如有这样一组的对象:​运输工具+引擎+控制器。它可能会有几个变体:汽车+内燃机+方向盘 飞机+喷气式发动机+操纵杆如果你的程序中并不涉及产品系列的话,那就不需要抽象工厂。2、结构图3、C++代码#include <string>#include <iostream>// 系列产品中的特定产品必须有一...

2020-11-22 16:24:00 1

原创 简单工厂模式--创建型模式

描述:简单工厂模式描述了一个类,它拥有一个包含大量条件语句的构建方法,可根据方法的参数来选择对何种产品进行初始化并将其返回。简单工厂通常没有子类,但当从一个简单工厂中抽取出子类后,它看上去更像经典的工厂方法模式了。结构图:C++实现:#include <string>#include <iostream>// 产品接口中将声明所有具体产品都必须实现的操作。class Product { public: virtual ~Product() {}

2020-11-22 15:10:54

原创 工厂方法模式--创建型模式

工厂方法是一种创建型设计模式,解决了在不指定具体类的情况下创建产品对象的问题。1、结构图2、C++代码#include <string>#include <iostream>// 产品接口中将声明所有具体产品都必须实现的操作。class Product { public: virtual ~Product() {} virtual std::string Operation() const = 0;};// 具体产品需提供产品接口的各种实现。

2020-11-22 14:55:13 6

原创 单例模式--创建型模式

1、描述单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。单例拥有与全局变量相同的优缺点。尽管它们非常有用,但却会破坏代码的模块化特性。2、结构图3、C++代码在muduo库中有一个单例类模板,可以参考https://blog.csdn.net/qu1993/article/details/109476614下面是一个使用互斥锁实现的线程安全的单例类,这个例子是最后提到的网站的例子,但我觉得这个例子不太好#include <...

2020-11-22 14:37:46 5 1

原创 开闭原则

《设计模式之禅》定义:Software entities like classes,moduls and functions should be open for extension but closed for modifications.(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。)开闭原则告诉我们赢尽量通过扩展 软件实体的行为来实现变化,而不是通过修改已有的代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。为什么要采用开闭原则首先,开闭原则

2020-11-22 12:52:07 18

原创 迪米特法则

《设计模式之禅》定义:迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP),虽然名字不同,但描述的是同一个规则:一个对象应该对其他对象有最少的了解。通俗的讲,一个类应该对自己需要耦合或调用的类知道的最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。迪米特法则对类的低耦合提出了明确的要求,其包含以下4层含义:只和朋友交流

2020-11-22 12:50:14

原创 接口隔离原则

《设计模式之禅》定义:Clients should not be forced to depend upon interfaces that they don't use.(客户端不应该依赖它不需要的接口。)The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上。)...

2020-11-22 12:49:37 1

原创 依赖倒置原则

《设计模式之禅》依赖倒置原则(Dependence Inversion Principle,DIP)。定义:High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.高层模块不应该依赖底层模块,两

2020-11-22 12:48:56 5

原创 里氏替换原则

第一种定义,也是最正宗的定义:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序

2020-11-22 12:47:38

原创 单一职责原则

《设计模式之禅》:单一职责原则(Single Responsibility Principle),简称SRP。定义:应该有且仅有一个原因引起类的变更。There should never be more than one reason for a class to change。单一职责原则的好处:类的复杂性降低,实现什么职责都有清晰明确的定义; 可读性高,复杂性降低,那当然可读性提高了; 可维护性提高,可读性提高,那当然更容易维护了; 变更引起的风险降低,变更时必不可少的,如果接口的

2020-11-22 12:41:52 3

原创 TcpClient

TcpServer表示服务端,那么TcpClient表示的就是客户端。TcpClient::TcpClient(EventLoop* loop, const InetAddress& serverAddr, const string& nameArg) : loop_(CHECK_NOTNULL(loop)), connector_(new Connector(loop, serverAdd

2020-11-09 16:04:28 9

原创 TcpConnection

TcpConnection是muduo库中最重要的一个类。是整个网络库的核心,封装一次TCP连接。而且该类的生命期由用户和库共同控制,因为其生命期的管理更加复杂,所以该类使用shared_ptr管理,并继承了std::enable_shared_from_this<TcpConnection>。关于enable_shared_from_this可以参考这篇博客:https://blog.csdn.net/caoshangpa/article/details/79392878。void m.

2020-11-09 15:53:15 7

原创 Connector

该类和Acceptor有点相似,都是建立连接的,区别在于Connector是客户端使用的,Acceptor是服务端使用的,而且Connector有重连机制,还有一个区别是Acceptor是一直有效的,一直等待读事件的发生,而Connector只关心一次写事件,建立连接之后,Connector不再关心任何事件,只有等到重连的时候才会重新关心写事件。Connector::Connector(EventLoop* loop, const InetAddress& serverAddr) : lo

2020-11-09 15:27:09 6

原创 TcpServer

服务端类,一个服务端只需要一个该实例。TcpServer::TcpServer(EventLoop* loop, const InetAddress& listenAddr, const string& nameArg, Option option) : loop_(CHECK_NOTNULL(loop)), ipPort_(listenAddr.t

2020-11-09 15:18:19 13

原创 EventLoopThreadPool

事件循环线程池,当需要多线程处理事件时使用。该类的主要成员是std::vector<std::unique_ptr<EventLoopThread>>threads_,EventLoopThread启动一个线程,在其中运行EventLoop::loop()。先说下EventLoopThread。EventLoopThread::EventLoopThread(const ThreadInitCallback& cb, .

2020-11-09 15:06:34 7

原创 EventLoop

EventLoop事件循环(反应器Reactor),每个线程只能有一个EventLoop实体,它负责IO和定时器时间的分派。int createEventfd(){ int evtfd = ::eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); if (evtfd < 0) { LOG_SYSERR << "Failed in eventfd"; abort(); } return evtfd;}EventLoo

2020-11-09 14:59:58 5

原创 Channel

class Channel : noncopyable{ public: typedef std::function<void()> EventCallback; typedef std::function<void(Timestamp)> ReadEventCallback; Channel(EventLoop* loop, int fd); ~Channel(); void handleEvent(Timestamp receiveTime); .

2020-11-09 14:46:52 179

原创 Poller

在muduo中,Poller貌似这是唯一一个虚基类。EPollPoller和PollPoller继承自该类,对外提供统一的接口。因为muduo主要使用epoll接口,所以PollPoller不在分析。先看接口:class Poller : noncopyable{ public: typedef std::vector<Channel*> ChannelList; Poller(EventLoop* loop); virtual ~Poller(); /// .

2020-11-09 14:46:31 6

原创 eventfd

#include <sys/eventfd.h>int eventfd(unsigned int initval, int flags);《Linux/UNIX系统编程手册》自内核2.6.22起,Linux通过eventfd()系统调用额外提供了一种非标准的同步机制。这个系统调用创建了一个eventfd对象,该对象拥有一个相关的由内核维护的8字节无符号整数,它返回一个指向该对象的文件描述符。向这个文件描述符中写入一个整数将会把该整数加到对象值上。当对象值为0时对该文件描述符的read.

2020-11-06 13:29:21 5

原创 muduo使用的事件类型说明

在Channel::handleEventWithGuard()中,处理各种事件类型:void Channel::handleEventWithGuard(Timestamp receiveTime){ eventHandling_ = true; LOG_TRACE << reventsToString(); if ((revents_ & POLLHUP) && !(revents_ & POLLIN)) { if (logHu

2020-11-05 18:12:46 9

原创 TimerQueue

int createTimerfd(){ int timerfd = ::timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC); if (timerfd < 0) { LOG_SYSFATAL << "Failed in timerfd_create"; } return timerfd;}struct timespec .

2020-11-05 14:46:25 8

原创 timerfd

始于版本2.6.25,Linux内核提供了另一种创建定时器的API。Linux特有的timefd API,可从文件描述符中读取其所创建定时器的到期通知。因为可以使用select()、poll()和epoll()将这种文件描述符会同其他描述符一同进行监控,所以非常实用。这组API中的3个新系统...

2020-11-05 09:48:29 11

通过路径的方式对树进行增删改查

通过路径的方式对树进行增删改查,使用二叉树的方式存储普通的树,并实现对于树的增删改查等接口函数,包括测试程序。

2018-10-21

关于sscanf使用的一些疑惑

发表于 2020-07-29 最后回复 2020-07-30

关于字节对齐的问题

发表于 2020-03-25 最后回复 2020-07-30

关于写文件的问题

发表于 2020-05-08 最后回复 2020-07-30

论坛的积分可以用来干嘛

发表于 2020-01-13 最后回复 2020-01-13

C语言中关于定义后未使用的问题

发表于 2019-10-28 最后回复 2019-11-03

stm32的fsmc可以使用普通IO做片选吗?

发表于 2017-04-18 最后回复 2017-05-27

51单片机都有数据线和地址线,可以连接数个芯片进行内存或寄存器读写,而stm32为什么没有数据线地址线,只能复用fsmc,最多仅支持4个

发表于 2017-04-07 最后回复 2017-04-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除