- 博客(36)
- 资源 (2)
- 收藏
- 关注
原创 设计模式总结
第一讲:设计模式简介什么是设计模式“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。——Christopher Alexander如何解决复杂性1.分解即分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。分解是人们面对复杂性时的常见做法2.抽象由于不能掌握全部的复杂对象,从而选择忽视它的非本质细节而去处理泛化和理想化的对象模型。抽象是处理复杂性的更高层次的解决方案,也是通用的技术软件设
2022-04-25 20:34:04
192
原创 Vistor-访问者模式
动机在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?模式定义表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)结构要点Visitor 模式通过所谓双重分发(double dispatch)来实
2022-04-25 20:23:16
273
原创 Command-命令模式
动机在软件构建过中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合 — 比如需要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的在这种情况下,如何将“行为请求者”与“行为实现者”解耦,将一组行为抽象为对象,可以实现二者之间的松耦合模式定义将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作结构要点Command 模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在
2022-04-25 19:24:09
114
原创 Interpreter-解释器模式
动机在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的变成方式来实现将面临非常频繁的变化在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的模式定义给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子结构要点Interpreter 模式的应用场合是 Interpreter 模式应用中的难点,只有满足“业务规则频繁变化,且类似结构不断重复出现,并
2022-04-25 10:33:01
89
原创 Chain-of-Resposibility-责任链
动机在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者;如果显示指定,将不可避免地带来发送者和接受者的紧耦合如何使请求的发送者不需要指定具体的接受者,让请求的接受者自己在运行时决定来处理请求,从而使两者解耦?模式定义使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,知道有一个对象处理它为止结构要点责任链模式的应用场合在于“一个请求可能有多个接收者,但是最后真正的接收者只有一个”,这时候请求
2022-04-25 10:18:08
59
原创 Iterator-迭代器模式
动机在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式模式定义提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示结构要点迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示迭代多态:为遍历不同的
2022-04-24 19:29:36
73
原创 Composite-组合模式
动机软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,为代码的维护性、扩展性等带来了弊端如何将“客户代码与复杂的对象容器结构”解耦,让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?模式定义将对象组合成树形结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性(稳定)结构要点Composite 模式采用树形结构来实
2022-04-24 16:54:28
57
原创 Mediator-中介者模式
动机在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将会面临不断的变化在这种情况下,我们可以使用一个“中介对象”来关系对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化模式定义用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖 -> 运行时依赖 ),从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互结构https:/
2022-04-24 16:29:30
53
原创 Adapter-适配器模式
动机在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中使用,但是新环境要求的接口是这些现存对象所不满足的如何应对这种“迁移的变化”,如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?模式定义将一个类的接口转成客户希望的另一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作结构要点继承新接口,组合旧接口Adapter 模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复
2022-04-24 15:34:20
92
原创 Proxy-代理模式
动机在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦如何在不失透明操作(一致性)对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式模式定义为其他对象提供一种代理以控制(隔离 ,即使用接口)对这个对象的访问结构要点“增加一层间接层” 是软件系统中对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的 p
2022-04-24 14:55:45
57
原创 Facade-门面模式
动机上述A方案的问题在于组件的客户和组件中各种复杂的子系统有过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合会面临很多变化的挑战如何简化外部客户程序和系统间的交互接口,如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?模式定义为子系统中的一组接口提供一个一致(稳定)的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)(隔离变化和稳定)结构结构要点从客户程序角度来看,Facade 模式简化了整个组件系统的接口,对于组件内部.
2022-04-24 14:40:12
98
原创 Bridge-桥模式
动机由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?模式定义将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。——《设计模式》GoF结构要点Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。Brid
2022-04-24 11:49:40
94
原创 Decorator-装饰模式
动机在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?模式定义动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 &
2022-04-22 15:48:40
42
原创 Builder-构建器(建造者)模式
动机在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?模式定义将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)结构要点Builder 模式主要用于“分步骤构建一个复杂的对象
2022-04-22 11:50:36
84
原创 Prototype-原型模式
动机在软件系统中,经常面临着“ 某些结构复杂的对象 ”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口如何应对这种变化,如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?模式定义使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象结构要点Prototype 模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的
2022-04-20 16:30:39
68
原创 Observer-观察者模式
动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。模式定义定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。——《设计模式》 GoF结构https://img-b
2022-04-20 09:17:23
61
原创 AbstractFactory-抽象工厂
动机在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合模式定义提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类结构要点如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的工厂完全可以。“系列对象”指的
2022-04-19 15:56:56
50
原创 FactoryMethod-工厂方法
动机在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?模式定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。——《设计模式》GoF结构要点Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变
2022-04-19 15:08:34
70
原创 Memento-备忘录模式
动机在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现如何实现对象状态的良好保存与恢复,但同时又不会因此而破坏对象本身的封装性?模式定义在不破环封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态结构要点备忘录 (Memento)存储原发器(Originator)对象的内部状态,在需要时恢复原发器状态
2022-04-19 10:41:42
62
原创 Flyweight-享元模式
动机在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中 , 从而带来很高的运行时代价一主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作模式定义运用共享技术有效地支持大量细粒度的对象要点面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight 主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题Flyweight 采用对象共享的做法
2022-04-19 09:19:02
59
原创 State-状态模式
动机在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为可能完全不同如何在运行时根据对象的状态来透明地更改对象的行为,而不会为对象操作和状态转换之间引入紧耦合?模式定义允许一个对象在其内部状态改变时改变它的行为,从而使对象看起来似乎修改了其行为要点State 模式将所有与一个特定状态相关的行为都放入一个 State 的子类对象中,在对象状态切换时,切换相应的对象;但同时维持 State 的接口,这样实现了具体操作与状
2022-04-19 09:16:53
57
原创 Singleton-单例模式
动机在软件系统中 , 经常有这样一些特殊的类 , 必须保证它们在系统中只存在一个实例 , 才能确保它们的逻辑正确性、 以及良好的效率。如何绕过常规的构造器 , 提供一种机制来保证一个类只有一个实例?这应该是类设计者的责任 , 而不是使用者的责任。模式定义保证一个类仅有一个实例 , 并提供一个该实例的全局访问点。要点Singleton模式中的实例构造器可以设置为protected以允许子类派生Singleton模式一般不要支持拷贝构造函数和clone接口,因为这有可能导致多个对象实例
2022-04-19 09:12:38
93
原创 TemplateMethod-模板方法
动机在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?模式定义定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。 Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。——《设计模式》 GoF要点
2022-04-19 09:09:38
38
原创 Strategy-策略模式
动机在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?模式定义定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化) 。——《设计模式》 GoF结构[{“src”:“xap:resources/9437d36053ab0
2022-04-19 09:03:57
44
原创 ssh免密登陆失败问题
1. 使用ssh -vvv hostname 登陆测试返回了debug3: receive packet: type 51然后提示使用密码登陆debug1: Next authentication method: password2. 修改.ssh目录权限,authorized_keys权限结果:还是一样3. 网上还有其他人说的,修改/etc/ssh/sshd_config 也是不行4. 最后使用了sshd - SSH-Key authentication fails -
2021-09-30 11:35:29
2675
1
原创 SET_TARGET_PROPERTIES called with incorrect number of arguments.
SET_TARGET_PROPERTIES(test PROPERTIES VERSION ${VERSION_INFO} SOVERSION 1)cmake执行上面语句出现以下错误SET_TARGET_PROPERTIES called with incorrect number of arguments.原因是 VERSION_INFO 是空,导致SET_TARGET_PROPER...
2019-08-04 13:56:01
10884
原创 Ubuntu 18.04 源
1. 使用 lsb_release -a 查看系统版本No LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 18.04.2 LTSRelease: 18.04Codename: bionic2. 备份sources.listsudo cp /etc/apt/source...
2019-08-04 12:27:37
236
转载 SDP学习
在SIP编程中,设置SDP的过程很简单,snprintf (tmp, 4096,"v=0\r\n""o=anonymous 0 0 IN IP4 0.0.0.0\r\n""t=1 10\r\n""a=username:rainfish\r\n""a=password:123\r\n"); osip_message_set_body (invite, tmp, str...
2018-09-15 20:07:07
782
原创 基于Ubuntu的Asterisk环境搭建
基于Ubuntu系统//获取源码,版本可以自己选 wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-15.6.0.tar.gz //解压 tar -zxvf asterisk-15.6.0.tar.gz //安装基本库,最好修改下 下载源,国内改为阿里云等等 sudo apt-get ins...
2018-09-10 23:46:45
1336
原创 git使用简要
下载git: https://git-scm.com/downloads 安装好后开始菜单里找到“Git”->“Git Bash” 在bash里面输入 $ git config --global user.name "Your Name" $ git config --global user.email "ema...
2018-09-07 23:56:47
137
原创 关于Asterisk SIP Info和SIP MESSAGE消息问题
1. 关于Asterisk SIP INFO问题想通过SIP INFO发送一个开锁消息,发现Asterisk服务器经常返回415 Unsupported media type,查看源码(chan_sip.c handle_request_info函数)发现Asterisk接收以下Content-Type /* Need to check the media/type */ ...
2018-09-07 21:18:28
2141
1
转载 ubuntu tftp+NFS+samba+ssh+telnet 服务开启
===========nfs cfg===================1.apt-get install nfs-kernel-server2./etc/exports/home/build_share *(rw,sync,no_root_squash,no_subtree_check)3./etc/init.d/pormap restart4./etc/init.d/nfs-...
2015-07-20 18:33:38
405
原创 GCC/G++编译器以及GDB调试
3.1 GCC/G++编译器以及GDB调试3.1.1GCC/G++编译器开发者通常选择GCC来编译C语言编写的源代码,选择G++来编译C++源代码。GCC/G++编译器没有图形界面,只能在终端上以命令方式运行。编译命令由命令名、选项和源文件名组成,格式如下所示:gcc [-选项 1] [-选项 2]…[-选项 n] g++ [-选项 1] [-选项 2]…[-选项 n]
2015-07-19 22:27:54
910
原创 Linux 基本常用操作
Linux 基本操作文章作为个人记录,未作修改,有些杂乱。2.1.1 Shell 程序man(info,--help),ls,cp,mv,cd,pwd,mkdir,rm,rmdir,cat,find,touch,tree,chmod,chown, nm, ln,echo, date,alias,gzip,tar,ldd其他2.1.2 控制台adduser ,passwd,us
2015-07-19 22:10:03
210
错误处理函数cspp.c
2015-07-19
错误处理函数cspp.h
2015-07-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人