自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(180)
  • 收藏
  • 关注

原创 设计模式中的原则

若一个类承担的职责过多,就等于把这些职责耦合在一起, 一个职责的变化可能会削 弱或者抑制这个类完成其它职责能力。这种耦合会导制脆弱的设计,当变化发生时,设计会 遭受到意想不到的破坏。依赖倒转原则是面向对象的标志,用哪种语言编写程序不重要,如果编写时考虑的 是如何针对抽象编程而不是针对细节编程,即程序的所有依赖关系都终止于抽象类或接口。面 对需求,对程序的改动是通过增加代码来完成的,而不是改动现有的代码。开发人员应该对程序中呈现出频繁变化 的那部分做出抽象,拒绝对任何部分都刻意抽象及不成熟的抽象。

2022-10-11 16:04:51 340 1

原创 Interpreter(解释器模式)行为型

描述:当不懂英文的中国人和不懂中文的外国人交流时会存在沟通障碍。这时有种翻译器能将两种语言进行转换各个对方国家语言,然后进行交流。定义:通常当一个语言需要解释执行,并且你可以将该语言中的句子表示成为 一个抽象的语法树时,可以使用解释器模式。

2022-10-11 15:56:32 380

原创 State(状态模式)行为型

描述:一天有早中晚,不同时间下,太阳光是不一样的。所以随着早中晚的状态变化,太阳的行为也随着变化。定义:状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。这其实就有点类似算法中的有限状态机的形式。其主要思想是程序在任意时刻仅可处于几种有限的状态中。在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。不过, 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。

2022-10-11 15:00:51 566

原创 Vistor(访问者模式)行为型

描述:顾客在超超市购买商品时,如苹果、图书等将放在购物车中,然后到收银员付款。在购物过程中,顾客需要对这些商品访问,以便确保这些质量,之后收银员计算价格时也需访问购物车中的商品。购物车作为ObjectStructure(对象结构)用于存放各种商品,而顾客和收银员作为访问这些商品的访问者,们需要对商品进行检查和计价。不同类型的商品其访问形式也可能不同,如苹果需要过秤之后再计价,而图书不需要。定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

2022-10-10 23:14:32 653

原创 Template Method(模板模式)行为型

模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,允许子类在不修改结构的情况下重写算法的特定步骤。把不变的代码部分都转移到父类中, 将可变的代码用 virtual 留到子类重 写。

2022-10-10 21:44:56 71

原创 Strategy(策略模式)行为型

策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

2022-10-10 21:15:46 200

原创 (Observer)观察者模式 行为型

描述:iPhone14通知发布,喜欢的客户都在等着iPhone14售卖,进行购买。此时客户是观察者,iPhone14是被观察者。观察者不需要时刻盯着被观察者,而是采用注册或者成为订阅的方式告诉被观察者:我需要你的某某状态,你要在它变化时通知我。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,也能够得到最高的反馈速度。定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得通知并自动更新。

2022-10-10 17:13:29 266

原创 Memento(备忘录模式)行为型

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

2022-10-10 16:17:08 299

原创 Mediator(中介者模式)行为型

描述:在租房时,租客需要联系中介,中介通过联系房主,构建起联系关系。定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

2022-10-10 10:59:08 253

原创 Iteratot(迭代器模式) 行为型

迭代器(Iterator):接口类,声明了遍历集合所需的操作(获取下一个元素、获取当前位置和重新开始迭代等)。具体迭代器(Concrete Iterators) :实现遍历集合的一种特定算法。迭代器对象必须跟踪自身遍历的进度,这使得多个迭代器可以相互独立地遍历同一集合。集合(Collection):接口类,声明一个或多个方法来获取与集合兼容的迭代器。请注意,返回方法的类型必须被声明为迭代器接口,因此具体集合可以返回各种不同种类的迭代器。

2022-10-09 22:13:02 358

原创 Command(命令模式)行为型

描述:看电视时,只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。定义:命令是一种行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。

2022-10-09 20:20:22 239

原创 Chain of Responsibility(责任链模式) 行为型

描述:如组长不能处理的金额,需要向经理请求,经理不能请求的需要向老板请求,这样就现成了一条链,每个级别都能处理这金额。而不是直接组长向老板请求。无需关心请求的处理细节以及请求的传递,只需将请求发送到链上。将请求的发送者和处理者解耦,是职责链模式的动机。定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。处理者(Handler)声明了所有具体处理者的通用接口。该接口通常仅包含单个方法用于请求处理,但有时其还会包含一

2022-10-09 16:13:25 303

原创 Proxy(代理模式) 结构型

代理模式又叫委托模式,是为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。代理模式通俗来讲就是我们生活中常见的中介。由于某些原因,一个类不能直接被客户端使用,所以我们可以创建这个类的代理类,实际上B就是A的影子而已。

2022-10-09 14:46:39 335

原创 Flyweight(亨元模式) 结构型

目的:该模式主要的设计目的是为了迎合系统大量相似数据的应用而生,减少用于创建和操作相似的细碎对象所花费的成本。大量的对象会消耗高内存,享元模式给出了一个解决方案,即通过共享对象来减少内存负载。作用:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。对于 C++来说就是共用一个内存块,对象指针指向同一个地方)

2022-10-09 11:24:53 410

原创 Facade(外观模式) 结构型

外观模式是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

2022-10-08 21:56:44 389

原创 Decorator(装饰模式) 结构型

动态地给一个对象添加一些额外的职责(不重要的功能,只是偶然一次要执行) ,就增加功能来说,装饰模式比生成子类更为灵活。建造过程不稳定,按正确的顺序串联起来进行 控制。

2022-10-08 21:18:48 293

原创 Composite(组合模式) 结构型

组合模式(部分整体模式)是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

2022-10-08 20:10:55 361

原创 Bridge(桥接模式) 结构型

桥接是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。

2022-10-08 18:10:12 672

原创 Adapt(适配器模式) 结构型

适配器模式在于接口的转换,例如:两孔转三孔的电源适配器,孔的数量可以理解为参数数量,若调用三孔参数的接口,而提供的接口只有两个参数,那么需要适配器进行接口的扩展改造。作用:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器。适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种。在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。他和装饰器模式一样可以动态扩展一些遗留或者不好改动的代码。

2022-10-08 16:39:43 757

原创 Singleton(单例模式)创建型

只涉及一个单一的类,该类否则创建自己的对象,同时确保只有单个对象被创建。这个类提供一种方法访问唯一的对象方式,可以直接创建,不需实例化该类的对象。保证一个类仅有一个实例,并提供一个访问它的全局访问点,主要解决一个全局使用的类频繁地创建与销毁。

2022-10-08 15:31:44 439

原创 Prototype(原型模式) 创建型

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2022-10-07 22:24:27 181

原创 Builder(生成器模式) 创建型

生成器是一种创建型设计模式,使你能够创建复杂对象。该模式允许你使用相同的创建 代码生成不同类型和形式的对象。

2022-10-07 21:32:40 221

原创 Abstract Factory(抽象工厂模式) 创建型

工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。描述:显示器生产商有显示器电路板种类有非液晶的和液晶的,工厂A生成非液晶显示器电路板,工厂B生产液晶显示器电路板;

2022-10-07 19:27:45 203

原创 Factory(工厂模式) 创建型

定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使用一个类的实例化延伸到其子类。创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,就是使用了C++多态的特性,将存在继承关系的类,通过一个工厂类创建对应的子类(派生类)对象。:将会对接口进行声明。对于所有由创建者及其子类构建的对象,这些接口都是通用的。:是产品接口的不同实现。:类声明返回产品对象的工厂方法。该方法的返回对象类型必须与产品接口相匹配。

2022-10-07 16:15:28 307

原创 共享库的使用

在后续dlsym函数的调用中使用这个句柄会导致首先在主程序值搜索符合,然后在程序启动时加载的共享库中进行搜索,最后在所有使用了。:调用dlsym函数之后加载的共享库中搜索symbol,这个标记适用于需要创建与在其他地方定义的函数同名的包装函数的情况。,可以使用dlsym函数返回的指针来调用该函数,可以将dlsym函数返回的值存储到一个类型合适的指针中。此函数在handle执向的库以及该库的依赖树中的库中搜索名为symbol的符合(函数或变量)。此函数返回一个包含地址addr的相关信息的地址。

2022-10-06 21:02:54 733

原创 登录记账.

Unix系统维护着两个包含与用户登录和登出系统有关的信息的数据文件:utmp文件维护着当前登录进系统的用户记录。wtmp文件包含着所有用户登录和登出行为的留痕信息以供审计之用。Linux,utmp位于文件位于/var/run/utmp,wtmp文件位于/var/log/wtmp。

2022-10-06 19:36:51 715

原创 daemon

deamon生命周期很长。在后台运行并且不拥有控制终端。deamon用来指向特殊任务,如:cron:一个在规定时间执行命令的daemon。sshd:安全shell deamon,允许在远程主机上使用一个安全的通信协议登录系统。httpd:HTTP服务器daemon,用于Web页面。inetd:Internet超级服务器daemon,监听从指定的TCP/IP端口上进入的网络连接并启动相应的服务器程序来处理这些连接。通常将daemon程序的名称以字母d结尾。

2022-10-06 16:15:23 814

原创 epoll编程接口

同I/O多路复用和信号驱动一样,Linux的epoll函数可以检查多个文件描述符上的I/O就绪状态,epoll函数的优点:当检查大量文件描述符时,epoll的性能比select和poll函数高很多。epoll既支持水平触发也支持边缘触发,而select和poll支持水平触发,信号驱动只支持边缘触发。epoll性能和信号驱动I/O类似,但epoll可避免复杂的信号处理流程,可以指定检查的事件类型。

2022-10-06 10:43:05 690

原创 虚拟内存操作

操作会设置共享内存段的一个属性,而不是进程的属性,意味着分页一旦因故障被锁进了内存,那么即使所有进程都与这个共享内存段分离了,分页还是会保持驻留在内存中的状态。与之相反的是,使用 mlock()(或 mlockall())锁进内存的区域只有在还存在进程持有该区域上的锁时才会保持被锁进内存的状态。由于加锁操作的单位是分页,因此被锁住的区域的结束位置为大于 length 加 addr 的下一个分页边界。adr地址必须是分页对齐的,并且由于返回的信息是有关整个分页的,length分页大小的下一个整数倍。

2022-10-04 17:39:56 1186

原创 远程调用-Sun RPC

构建一个庞大的单一程序,完成全部工作。把整个应用程序散布到彼此通信的多个进程中。假设所有进程运行在同一台主机上。假设某些进程会运行在其他主机上。不同部分之间需要网络通信的应用程序大多数是使用显式网络编程方式编写的,也就是如UNPvl中讲述的那样直接调用套接字API或 XTI API。使用套接字API时,客户调用socket、connect、read和write, 服务器则调用socket、bind、listen、 accept、read和write。

2022-10-04 15:24:01 2277 1

原创 远程调用-门

客户-服务器情形和过程调用时,存在三种不同类型的过程调用,如下所示:本地调用是同步的,门调用也是同步的。在进程内部,门是用描述符标识的,在进程以外门可能是用文件系统中的路径名标识的。此函由客户调用,调用在服务器进程的地址空间中执行一个服务器过程。无论是参数还是结果都存在两种数据类型:数据和描述符。数据参数:是由指向的一系列总共个字节。描述符参数:是一个结构的数组,每个元素含有一个从客户往服务器过程传递的描述符。所传递的结构数为,没有描述符参数,指定成一个空指针,把指定为0。返回时指向数据结果表示结果大小,

2022-10-02 22:25:26 582

原创 管道和FIFO

管道是一种把两个进程之间的标准输入和标准输出连接起来的机制。管道是一种历史悠久的进程间通信的方法。当进程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。对管道的读写与一般的IO系统函数一致,使用write()函数写入数据,使用read()读出数据。

2022-09-30 22:48:48 731

原创 Posix与System V共享内存区

要使用 POSIX 共享内存对象需要完成下列任务:使用shm_open()函数打开一个与指定的名字对应的对象。shm_open()函数与 open()系统调用类似,它会创建一个新共享对象或打开一个既有对象。作为函数结果,shm_open()会返回一个引用该对象的文件描述符。将上一步中获得的文件描述符传入mmap()调用并在其flags参数中指定MAP_SHARED。这将共享内存对象映射进进程的虚拟地址空间。与mmap()一样,一旦映射了对象之后就能够关闭该文件描述符而不会影响到这个映射。

2022-09-29 21:52:18 815

原创 共享内存区

共享内存区是可用IPC形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核。往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步,各种形式的同步:互斥锁、条件变量、读写锁、记录锁、信号量。服务器使用一个信号量取得访问某个共享内存区对象的权利。服务器将数据从输入文件读入到该共享内存区对象。read函数的第二个参数所指定的数据缓冲区地址指向这个共享内存区对象。服务器读入完毕时,使用一个信号量通知客户。

2022-09-29 21:51:46 710

原创 Posix与System V IPC

三种类型的IPC合称为"Posix IPC":Posix消息队列;Posix信号量;Posix共享内存区;三种类型的IPC和称为"":System V消息队列。System V信号量。System V共享内存区。

2022-09-29 00:10:26 439

原创 System V信号量

使用Svstem V信号量的常规操作步骤:使用semget()创建或者打开一个信号量集。使用semctl() SETVAL 或 SETALL操作初始化集合中的信号量(只有一个进程需要完成这个任务)。使用semop()操作信号量的值。使用信号量的进程通常会使用这些操作来标识一种共享资源的获取和释放。当所有进程都不再需要使用信号量集之后操作删除这个集合(只有一个进程需要完成这个任务)。System V信号量是以分配被称为信号量集的组为单位进行的。在使用semget()

2022-09-28 16:35:46 675

原创 Posix信号量

信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。Posix有名信号量:使用Posix IPC名字标识,可用于进程或线程间的同步。Posix基于内存的信号量:存放在共享内存区中,可用于进程或线程间的同步。System V信号量:在内核中维护,可用于进程或线程间的同步。只考虑不同进程间的同步。首先考虑二值信号量: 其值或为0或为1的信号量。如下图所示:图中画出该信号量是由内核来维护的(对于SystemV信号量是正确的),其值可以是0或1。Posix信号量不必在内核中维护。

2022-09-28 16:35:15 1276 1

原创 POSIX与System v消息队列

消息队列是内核地址空间中的内部链表,通过 Linux 内核在各个进程之间传递内容。消息顺序地发送到消息队列中,并以几种不同的方式从队列中获取,每个消息队列可以用lPC标识符唯一 地进行标识。内核中的消息队列是通过IPC 的标识符来区别的,不同的消息队列之间是相对独立的。每个消息队列中的消息,又构成一 个独立的链表。1.信息缓冲区结构常用的结构msgbuf结构。可以使用下面的结构为模板定义自己的信息结构。在头文件};mtype: 消息类型,以正数来表示。

2022-09-27 12:14:12 1116

原创 进程创建和程序执行

参数flags服务于双重目,低字节中存放着子进程的终止信号,子进程退出时其父进程将收到这一信号,flags也可能为0不会产生任何信号,参数flags的剩余字节则存放位掩码,控制clone()操作。经过适当转换,子函数可对该参数的含义自由解读,当函数func返回或是调用exit()之后,克隆产出的子进程就会终止,父进程可以通过wait()函数来等待克隆子进程。升至高水位,则恢复记账。克隆子进程共享父进程,所以不能使用父进程的栈,调用时需分配内存空间供子进程栈使用,将内存指针置于参数child_stack中。

2022-09-26 10:30:23 297

原创 定时器与休眠

下列函数创建一个间隔定时器,这种定时器在某个时间点到期,并与此后每隔一段时间到期一次,创建的定时器可跨越exec()调用得以保存,但由fork()创建的子进程并不继承该定时器。若自处理或接收定时器信号之后,定时器仅到期一次,则溢出计数为0。所指定的时间间隔后到期的一次性定时器,否则,在每次定时器到期之后,都会将定时器重置为在指定间隔后再次到期。创建3种不同类型的定时器which的类型:对下列情况所有这些信号的默认处置均会终止进程。返回定时器的时间时间,除非再次调用setitimer(),否则该值一直不变。

2022-09-25 22:44:04 446

空空如也

空空如也

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

TA关注的人

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