随笔分类 -  设计模式

享元模式及C++实现
摘要:享元模式(flyweight)flyweight是轻量级的意思,中文这边翻译成享元,更容易让人理解一些。享元模式是为了应对大量细粒度对象重复的问题。程序中存在大量细粒度的对象,每次要使用时都必须创建一个新的对象,既影响了运行效率又增加了内存消耗。于是有了享元模式,享元模式提取出这些细粒度对象中间公共的状态(属性,我的理解),只生成一个实例对象,所有用到这些公共属性对象的地方,都指向这一个实例。根据我的理解,很多类有一部分的属性是可以共享的,而不可共享的部分需要提取出来,通过参数传递来使用。典型的享元模式的例子为文书处理器中以图形结构来表示字符。一个做法是,每个字形有其字型外观,字模metric 阅读全文
posted @ 2013-07-16 21:02 曾经的你| 阅读(4376) 评论(0) 推荐(1) 编辑
组合模式及C++实现
摘要:组合模式组合模式,是为了解决整体和部分的一致对待的问题而产生的,要求这个整体与部分有一致的操作或行为。部分和整体都继承与一个公共的抽象类,这样,外部使用它们时是一致的,不用管是整体还是部分,使用一个方法即可遍历整体中的所有的部分。就像一个树形结构一样。如下面的类图,client的只需要使用Component即可,无须关心到底是Leaf还是Composite。这里有两种情况,add函数对于Leaf来说是没有必要的,所以一种办法就是在Leaf的add实现中什么都不写。还一种办法就是将add方法挪到Composite中,让外部使用Composite和Component。但这样的缺点就是暴露了Comp 阅读全文
posted @ 2013-07-15 17:08 曾经的你| 阅读(3566) 评论(0) 推荐(0) 编辑
装饰者模式及C++实现
摘要:装饰者模式时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数,然后继承类中都相应的添加实现,这样做倒也没什么问题,但是如果这种变化来个好几次或者继承类非常多,那工作量可就大了。这时大神们就发明了装饰者模式,在不修改现在有接口和实现类的基础上实现功能或者状态的添加。从类图上看,ConcreteComponent是Component原有的继承类,而Decorator装饰者类也继承与Component,这样的是让Decorator的子类也可以方便的添加Compone 阅读全文
posted @ 2013-06-28 20:50 曾经的你| 阅读(11398) 评论(2) 推荐(1) 编辑
适配器模式及C++实现
摘要:适配器模式适配器模式是很好理解的模式了,生活中也非常常见,什么插头2口转3口,什么USB转PS2,这都算是适配器模式。说白了,就是如果有一些东西提供的接口你很像用,但是你手头没有好的接口使用它,这个就需要一个适配器,将你需要的接口转换成你所拥有的接口。这样的好处也是显而易见,就是你不用改变你现在所拥有的接口,保证你在任何地方的用法都不需要修改,然后底层的实现由适配器调用需要的接口来具体实现。常见的场景使用第三方库的时候,第三方的库肯定不能适用所有的系统,所以需要一个适配器来转换。优点1.屏蔽了具体的实现方式,实现了依赖倒转。2.可以把不统一的接口封装起来,使之成为统一的接口。3.把本来不方便适 阅读全文
posted @ 2013-06-27 20:05 曾经的你| 阅读(9147) 评论(5) 推荐(2) 编辑
桥接模式及C++实现
摘要:桥接模式先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化。桥接模式号称设计模式中最难理解的模式之一,关键就是这个抽象和实现的分离非常让人奇怪,大部分人刚看到这个定义的时候都会认为实现就是继承自抽象,那怎么可能将他们分离呢。这里引用《大话设计模式》里面的那个例子。这个例子中,每次添加一个新的手机品牌,则必须要添加相应的通讯录和游戏,而每次要给每个手机添加新功能,则所有的手机品牌下都必须继承一个新的类,这样工作量就大了,而且可能通讯录和游戏的实现方法是一样的,这就有很多重复代码。看到这里可能已经看到了端倪了,虽然这个最顶层 阅读全文
posted @ 2013-06-26 16:52 曾经的你| 阅读(7995) 评论(1) 推荐(2) 编辑
原型模式及C++实现
摘要:以下是我自己学习设计模式的感想。原型模式学过C++的都知道拷贝构造函数,复制一个对象分为浅拷贝和深拷贝。浅拷贝:就是给对象中的每个成员变量进行复制,就是把A1类中的变量直接赋给A2类中变量,属于值传递,但是涉及到有new之类内存分配的地方,他们却是共享内存的。深拷贝:就是不仅使用值传递,而是要每个变量都有自己一份独立的内存空间,互不干扰。默认的拷贝构造函数是浅拷贝的,如果要实现深拷贝,就需要重写拷贝构造函数T(const T&)。既然有了拷贝构造函数,还要引入原型模式呢?根据我自己查阅资料之后,我觉得好像是面向对象语言中都是引用传递,而且只提供简单的浅拷贝,所以没有拷贝构造函数这么一说 阅读全文
posted @ 2013-06-23 20:05 曾经的你| 阅读(10917) 评论(2) 推荐(0) 编辑
建造者模式及C++实现
摘要:下面是我自己对建造者模式的理解。具体我还没在开发中应用过,这只是对于书本的理解。建造者模式建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这是建造者模式的标准表达,不过看着让人迷惑,什么叫构建和表示的分离?一个对象使用构造函数构造之后不就固定了,只有通过它方法来改变它的属性吗?而且还要同样的构建过程搞出不同的表示,怎么可能呢?多写几个构造函数?其实多写几个构造函数,根据不同参数设置对象不同的属性,也可以达到这样的效果,只是这样就非常麻烦了,每次要增加一种表示就要添加一个构造函数,将来构造函数会多得连自己都不记得了,这违背了开放-封闭的原则。要不就只能设计几 阅读全文
posted @ 2013-06-22 16:47 曾经的你| 阅读(9739) 评论(0) 推荐(0) 编辑
单例模式及C++实现代码
摘要:单例模式单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目。但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能会优先考虑使用全局或者静态变量的方式,这样比较简单,也是没学过设计模式的人所能想到的最简单的方式了。一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一个对象,即增加了开销,也使得代码更加臃肿。其实,我们只需要一个实例对象就可以。如果采用全局或者静态变量的方式,会影响封装性,难以保证别的代码不会对全局变量造成影响。考虑到这些需要,我们将默认的构造函数声明为私有的,这 阅读全文
posted @ 2013-06-21 16:08 曾经的你| 阅读(147727) 评论(13) 推荐(14) 编辑
三种工厂模式的分析以及C++实现
摘要:以下是我自己学习设计模式的思考总结。简单工厂模式简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到底是返回了哪个子类。客户端唯一需要知道的具体子类就是工厂子类。除了这点,基本是达到了依赖倒转原则的要求。假如,我们不用工厂类,只用AbstractProduct和它的子类,那客户端每次使用不同的子类的时候都需要知道到底是用哪一个子类,当类比较少的时候还没什么问题,但是当类比较多的时候,管理起来就非常的麻烦了,就必须要做大量的替换,一个不小心就会发生错误。而使用了工 阅读全文
posted @ 2013-06-19 09:47 曾经的你| 阅读(63463) 评论(4) 推荐(10) 编辑