设计模式笔记-SINGLETON-VISITOR-OBSERVER等等等

感觉设计模式如果在工作中没有见过就直接看他的描述,很难懂。

SINGLETON以前在别人的代码里见过,稍微一看这个模式就明白什么意思了。当然这也是一个比较简单的模式

看完书上的介绍之后,有这么几点体会。

本质上说,SINGLETON相当于,给每个类添加一个静态的指向自己的指针。通过一个静态方法返回这个指针,这样,在使用的过程中,只需要包含进来头文件,就可以在任何地方,通过唯一方法,调用到同一个对象。同时,这个模式需要把被SINGLETON的类的构造方法设为protected,这样用户就无法通过构造方法来自己创建对象破坏单件性质。


VISITOR模式在osg里面经常出现,比如说想要把场景树里面的每个GEODE节点收集起来进行某项操作。

那么VISITOR具体是个什么东西呢,从书上的描述看,他有这么几个关键字,一个是抽象的树形结构,第二个是,对某一类型的类进行共有的操作,而又不想让这些操作固化成为这些类的成员方法。

事实上,osg就是这么做的,场景被组织成为一个场景树,想要对某个树根下单某一类的所有节点进行操作,就需要用这个VISITOR模式,有点树的遍历的感觉。另外,在VISITOR的apply方法里面,必须要做到一个工作就是判断类型,只有遇到特定类型的节点,才能进行特定的操作。


OBSERVER模式

观察者模式看完他的介绍之后,最大的感受就是,这是一个一对多的广播机制。首先需要有subject角色,是被观察到那个人。另外还有一个observer角色。抽象目标类里面注册有所有的观察者,任何派生自抽象观察者类的子对象,都可以注册到目标类里面。另外,具体observer类里面应该保存有一个subject对象的引用。

这样,具体subject发生变更的时候,可以通知注册的所有observer。

observer可以利用保存的subject实例,来帮助自己进行注册。


COMMAND模式

桌面程序中,经常会有同一个命令需要在不同地方调用的情况,比如打开命令,需要在菜单栏有一个,在工具栏的文件夹小图标上也能执行打开命令。那么,难道要在菜单选项和图标里都包含相同的打开命令吗,显然这样很难看。

COMMAND模式的本质在于,将命令和他的执行者进行了解偶。也就是,执行者不需要是调用命令的那个菜单项或者是小图标。菜单项和小图标会在整个应用或者是父元素的支配下,被分配一个相同的command对象,至于这个command对象的内容,他们无需知道,只要在被点击的时候执行command->execute()就可以了。之后,我们可以分别定义各个类型的命令,将可以执行对应功能的类的对象传入各个类型的command,这些对象负责在execute中执行具体操作。


ITERATOR模式

迭代器是STL里面的熟面孔。这个模式提供了一种方法,可以访问一个聚合对象中的各个元素,而不需暴露这个聚合对象的内部表示。

简单来说,就是要定义一个针对具体类型数据结构的迭代器和迭代方法。用户在创建了这个类型的数据结构之后,可以通过这个对应类型的迭代器进行遍历访问。这也就是为什么在使用STL的过程中,需要针对每个类型的数据结构,都要进行一回得到迭代器的操作vector<XXX>::iterator YYY;,因为只有和ector对应的迭代器才能完成对vector的操作。这么一理解,这个设计模式就简单多了。


TEMPLATE模式

这个template其实也经常用,简单来讲就是,父类定义一个过程,在中间插入一个空的占位方法,这个方法在C++里面可能是一个虚函数。在子类继承父类的时候,来具体实现这个占位方法,或者叫做钩子函数。这样的话,父类定义的过程之于每个子类就是不同的效果,就相当于定义了一个模板。用户在使用的时候,只调用父类的这个过程模板,这样的话在每一个具体的情况下,都能在相同的流程下做出具体的反应。

TEMPLATE模式适用于那些,需要根据不同的子类有不同的处理的情景,而同时,这些子类的处理过程又要遵循同样的先后顺序。不过也有一些缺点,一个是,父类定义的过程一定要详尽的进行各种考虑,另一个是,如果只看子类的代码很难看懂,需要再去翻父类的代码,才能明白发生了什么事情。


ABSTRACT FACTORY模式

抽象工厂最重要的地方在于“抽象”两个字。用户在使用的过程中,始终是操作抽象的工厂和抽象的产品。通过抽象产品的提供的一般化的借口,来完成产品的组装。也就是说,产品各个部分功能的实现,是对用户遮蔽起来的,用户能做的只能是操作一般化的借口来控制产品进行某种功能,或者组装到现有的系统中。用户方法中,通过抽象的工厂指针,来承接各个抽象工厂的子类也就是具体工厂。具体工厂按照遮蔽起来的方法返回具体产品,但是具体产品在用户看来,仍然是抽象的,只能通过一般化或者叫协商好的方法借口,来控制具体产品。

比如同样是滚动条,出现在编辑窗口的滚动条和出现在下拉列表中的滚动条他们的样子可能不太一样,比如一个红色一个绿色。那么用户只需要向创建方法creator中传入蓝色scrollerfactory和红色scrollerfactory,就可以分别返回带蓝色滚动条的编辑窗口,和红色滚动条的下拉列表。在创建方法里,只是按照协商好的步骤,先让父类指针factory创建mainweidget,再一般化地添加一个scroller。至于这个scroller是什么颜色,最后返回mainwidget。完全取决于父类指针所指向的内容,也就是子类对这个方法的实现。这个用户控制的这个创建方法所了解到全都是抽象的工厂factory和抽象的产品mainwidget。这也就是“抽象”的意思。


GUILDER模式

生成器模式和抽象工厂模式相比,在创建方法中甚至都不用保存抽象产品,只需要调用抽象的生成器的添加产品的方法,就可以取得最终的产品。用户完全不需要了解产品的结构和表示,生成器完全遮蔽了创建和装配一个产品的所有代码。用户只需要进行引导,利用生成器创建拥有五个抽屉的桌子,或者三个抽屉的桌子,最后一步返回桌子拿走去用就是了。和抽象工厂不同,生成器侧重于一步一步生成产品,用户可以指导生成的过程,不同的过程(组合)会产生不同的产品。而抽象工厂侧重于产生同一大类下不同的小类的产品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值