大家都知道,设计模式分3类23种,创建型5种,结构型7种,行为型11种。

创建型,字面意思就是用于创建对象的,我们只要创建一个全局共享的对象,比如对模块接口的封装,那么就用单例模式;我们要创建很多个对象,就用工厂方法,一个具体的工厂接口创建对象;我们要创建一组相关的对象,就用抽象工厂,将创建各种对象的工厂抽象出来;我们要通过一个原型创建对象,并拷贝原型中的内容到新创建的对象中呢,那就用原型模式;要创建复杂的对象呢,一个对象的创建分为很多步骤,并且我们希望通过控制步骤创建不同的复杂对象,那么就用builder模式,通过传入direactor不同的builder产生不同的对象。

结构型,字面意思就是描述对象结构的,我想分为3种对象间的结构和4种对象内的结构,说到结构,那么我们第一能想到的就是’部分-整体‘的结构关系,生活中我们看到的物体都是部分组成的整体,那就是组合模式,比如family-tree;除了’部分-整体‘的关系,还有就是平行关系,大家都是一个对象,那么管理这种对象的容器就是享元模式;然后就是桥梁结构,桥梁结构就是将一个部分和另一部分通过桥梁搭连起来,设计模式里的桥接模式就是将接口和实现分离,然后桥接起来,具体说就是接口类+实现类,提供给用户的是接口类,将创建类指针传递给接口类实现功能;对象或模块间接口兼容性转换的(比如c++ wrappe c 系统api),用adapter模式,这里只是一对一转换接口,转换形式并不改变功能;假如要一对多的接口转换呢,那么就用facade模式,将多个功能接口转换为一个用户关心功能合并的接口;我们知道对象的功能也是通过接口提供给用户的,那么我们希望增加接口的功能,但是又不能改变对象或者生成子类,那么就用装饰器模式,通过把对象指针传递给一个装饰器,装饰器提供的接口与对象接口相同,并在调用对象接口前后增加功能;这几种都是对象的接口或功能相关的,那么现在我们希望控制或记录对一个对象的访问呢,那就是proxy模式,比如智能指针,他只是提供一个对对象访问的计数,而且他和对象是一对一的关系,并不像装饰器根据功能可以动态的定义很多装饰器。

行为型,字面意思就是描述对象行为的,c++的多态是一个行为,不过只是通过将子类对象赋值给基类指针实现,这里我把行为模式分为行为的封装7种,对象间行为2种,方法的预定义行为1种,解释语法行1种共4类;举个例子,人是一个对象,他有不同的状态(心情),内部状态不同时对外表现行为也不同;他有不同的知识(算法)储备,知道该什么时候用感情去感化,什么时候用数学方法;他会与外界通信:电话或者网络,而不是一个与世隔绝的人;他在不同的社会关系种表现出的行为也是不同的,比如对待陌生人和熟人;封装了一个操作,将命令对象设置下去,需要的地方调用命令对象的方法,设置回调,在需要的地方调用回调;封装了多个不同对象的操作,visitor模式;封装了访问和遍历集合中对象的方式,迭代器模式;封装了不同内部自变化状态,消除if-else,用户只管调用操作并不改变状态,外部调用同一个操作时表现出不同行为(外部并知道当前内部状态,状态为内部自变化);封装了不同算法,通过strategy对象切换,消除switch-case;封装了不同对象间的通信行为,中介者模式,将各个对象的通信抽象统一起来;封装了对象的上一个状态,备忘录模式;上面都是封装行为,现在说说对象间的行为,将多个对象连接成链,并允许一个命令进行传递,那么就是职责链模式;将一个对象的状态变化通知多个感兴趣的对象,基于发布-订阅模型,有观察者和目标两个角色,那就是观察者模式;要解释一段表达式要表达的内容,也就是求一段表达式的结果,比如执行正则表达式,c++布尔表达式,那就是解释器模式;现在要规范一个子类的算法行为,让子类按基类定义的行为在子类选择重定义某些部分,那就是模板方法模式。对行为的封装7种(不同对象间的2种,相同对象集合1种,1个对象的4种),对一个表达式的解释行为1种,定义算法的结构以指导子类的行为1种,对象间的行为2种;定义必须实现的纯虚函数,可以重写的virtual函数,选择定义的覆盖同名空函数实现;模板方法非常基本,抽象类与具体类实现种非常常见,比如ACE框架,子类继承时选择感兴趣的方法重写;单个对象封装行为2个,命令模式封装了一个对象一个的操作,备忘录模式封装记录了一个对象的上一次状态,visitor模式封装了多个对象的操作,mediator封装了多个对象的通信,迭代器封装了相同对象集合的遍历和访问;注意visitor和mediator的主角时visitor和mediator,而不是他们封装的对象,所以我不划分为对象间行为而是一种封装行为;两个s开头的分别封装了不同状态和不同算法;两个对象间行为,职责链允许请求在不同对象间传递,观察者模式基于发布-订阅模型,实现通知;模板方法,写c++的人都用过的,定义一个面试基类,里面有做题,自我介绍,问讲;然后子类就根据具体职位实现了,技术类,销售类流程不是一样的;技术类里面有c++,java,ios也有差别;解释器,没用过,不过知道时干什么的,举2个例子,搜索正则表达式,find,ls,grep,根据关键字过滤,从左往右;布尔表达式a==b||c==d,编译器或者人计算布尔表达式的值,根据操作符优先级规则,从左往右。