随笔分类 -  设计模式

摘要:如何减少代码中的分支语句 代码中往往存在很多的分支语句:判断+执行;大量的分支语句让代码看上去很丑陋,而且容易增加代码复杂度。所以我觉得减少代码的分支语句或者隐藏分支语句是一件很有必要的事情,能够让代码变得更加清晰易读。减少分支语句,在实际的编程中遇到了一种比较好的方式——Command模式减少分支语句。Command模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。 所以可以将一系列请求都封装成对象,形成一个请求集合。当需要执行一个请求的时候直接去这个集合中查找到对应的请求对象,然后执行对象的Command。 下面以一个具体的例子看一下这个过程:结... 阅读全文
posted @ 2012-08-08 11:34 __Shadow 阅读(2964) 评论(0) 推荐(0) 编辑
摘要:Android学习 StateMachine与State模式一 State模式意图: 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。(Objects for States) 对象内部状态决定行为方式,对象状态改变行为方式改变;但这里为何要强调内部状态,外部状态改变也同样会影响行为方式的改变,通常外部状态的改变都会反映到内部状态上来。 Command模式是将命令请求封装成一个为对象,将不同的请求对象参数化以达到同样的调用执行不同的命令;同样State模式是将对象的状态封装成一个对象,是在不同的状态下同样的调用执行不同的操作。适用性: l 一个对象的行... 阅读全文
posted @ 2012-06-05 10:35 __Shadow 阅读(27745) 评论(3) 推荐(5) 编辑
摘要:Android学习 ContentProvider数据更新与Observer模式一 Observer模式意图: 定义对象之间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被更新。 依赖(Dependents)、发布-订阅(Publish-Subscribe)。处理一对多情况下对象之间的依赖关系。对象之间必然会存在依赖关系或者依赖关系会处于变动之中,如何解决依赖关系使他们之间的耦合性达到最小。适用性: l 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象以使他们各自独立的改变和复用; l 当一个对象的改变需要同时改变... 阅读全文
posted @ 2012-06-02 10:30 __Shadow 阅读(30055) 评论(1) 推荐(4) 编辑
摘要:Android学习CursorWrapper与Decorator模式一 Decorator模式意图: 动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 动态的给一个对象,而不是对整个类添加额外职责,说明此模式将采用的结构是组合而不是继承;要给一个对象添加职责,通常可以使用其类的派生类对象替换当前对象,但这显得不够灵活,继承结构属于静态形式,系统往往并不知道有这样的类存在; 而我们需要的在某些时刻让对象具有一些额外的职责,额外的职责很可能是来自我们自己的扩展或者某些时刻的特定需求等。于是通过一种方式对现有的对象进行动态的包装(Wr... 阅读全文
posted @ 2012-05-31 09:45 __Shadow 阅读(5678) 评论(0) 推荐(2) 编辑
摘要:Android学习按键事件监听与Command模式一 Command模式意图: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。 将请求被封装成一个对象,当向某对象提交请求时,使我们可以不用去知道被具体的请求的操作或者请求的接收者, 实现了动作的请求者对象和动作的执行者对象之间的解耦合。适用性:使用Command模式代替callback形式的回调应用;在不同的时刻指定、排列和执行请求,动态的更改请求;支持取消操作;支持修改日志,保存请求执行过程以便恢复操作;Command模式支持一组事务的调用操作。且易于增... 阅读全文
posted @ 2012-05-29 14:58 __Shadow 阅读(3230) 评论(0) 推荐(0) 编辑
摘要:Android学习——ActivityManager与Proxy模式的运用一 Proxy模式意图: 为其他对象提供一种代理以控制这个对象的访问。适用性: l 远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表。 l 虚代理(Virtual Proxy)根据需要创建开销很大的对象。使用一个代理对象作为代表,在真正的需要时进行创建。 l 保护代理(Protection Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。 l 智能指引(Smart Reference): 取代了简单的指针,它在访问对象时执行一些附加操作。对指向... 阅读全文
posted @ 2012-05-25 09:37 __Shadow 阅读(21437) 评论(3) 推荐(4) 编辑
摘要:Android中Adapter和Bridge模式理解和应用一 Adapter模式意图: 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。适用性:使用一个已存在的类,而它的接口不符合你的要求;你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口,而是使用对象适配器适配他们的父类接口;你想创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类(接口可能不一定兼容的类)协同工作;看看其结构图: 这是一个对象适配器结构图; 其实类似这样的类结构图(一个类包含了另一个类的实例并使用... 阅读全文
posted @ 2012-05-23 17:46 __Shadow 阅读(4510) 评论(1) 推荐(0) 编辑
摘要:一 Composite模式将对象组合成树形结构以表示“部分——整体”的层次结构。Composite使得用户对单个对象操作和组合对象的操作使用具有一致性。 这里面涉及到单个对象和组合对象的操作问题。 将单个对象和组合对象一致的对待能使:客户代码一致简单,使用更加灵活多变,便于扩展新的组合对象,便于对象的管理等。 统一对待单个对象和组合对象,势必要提供一些组合对象需要而单个对象不需要的操作或者属性等管理手段,这些手段对与单个对象或许根本不存在或者不适用,这样势必存在着一定风险隐患,造成不安全因素的存在。 但是单个对象和组合对象必然存在一些不同的地方,要将单个对象与组合对象一... 阅读全文
posted @ 2012-05-22 16:04 __Shadow 阅读(2640) 评论(0) 推荐(1) 编辑
摘要:PolicyManager工厂模式与动态加载 Android FrameWork——PolicyManager在学习Android跟踪setContentView执行过程代码的时遇到:Attach(){ //着实不清楚PolicyManager到底如何创建的,哪一个对象。 mWindow = PolicyManager.makeNewWindow(this);}其中用到Class.forName动态加载,Java是最近才学的还真不晓得有这样的用法;一 类之间关系于是就了解一下PolicyManager以及相关类实现方式;首先看一下各个类之间的UML图: PolicyManager:提... 阅读全文
posted @ 2012-04-09 14:56 __Shadow 阅读(5115) 评论(1) 推荐(1) 编辑
摘要:FlyWeight模式一 意图运用共享技术有效地支持大量细粒度的对象。二 动机 有些应用程序得益于在其整个设计过程中采用对象技术,但简单化的实现代价极大。使用面向对象的抽象化,可能会造成庞大的对象群,造成空间的巨大消耗,而影响性能。在文档编辑器例子中如果一个字符对应一个对象,那么一篇文档所要容纳的对象将是非常的庞大耗费大量的内存。 而实际组成文档的字符是有限的,是由这些字符不同的组合和排列得到的。所以需要共享,将基本的字符进行共享,将使得字符对象变得有限。Flyweight只存储相应的字符代码这里的关键概念是内部状态和外部状态之间的区别。 内部状态存储于flyweight中,它包含了独立于.. 阅读全文
posted @ 2012-02-06 19:50 __Shadow 阅读(15466) 评论(2) 推荐(0) 编辑
摘要:Facade模式一 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。二 动机 将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。达到该目标的途径之一是就是引入一个外观(Facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。将各个子系统整合起来作为Facade,提供给客户端使用。 看下面这样一个系统: 转变成: 三 适用性及其结构当你要为一个复杂子系统提供一个简单接口时。客户程序与抽象类的实现部分之间存在着很大的依赖... 阅读全文
posted @ 2012-02-03 10:54 __Shadow 阅读(14718) 评论(1) 推荐(2) 编辑
摘要:Decorator模式一 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。——包装器Wrapper。二 动机 有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。 一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装... 阅读全文
posted @ 2012-02-02 19:42 __Shadow 阅读(34495) 评论(2) 推荐(3) 编辑
摘要:Composite模式一 意图 将对象组合成树形结构以表示“部分——整体”的层次结构。Composite使得用户对单个对象操作和组合对象的操作使用具有一致性。二 动机 绘图编辑器和图形捕捉系统图形应用程序中,总是存在简单的图形到简单的组件再到复杂的组件,但他们在本质上都是图形(各种基本的图形组合或者递归组合)。这可以分成两个部分:基本图元和组件图形。对于基本的图元可以单独定义类;对于组件图形可以使用图元容器(Container)。 结果就是:在使用时,对于同样的都是图形的图元和组件必须加以区分对待(图元对象Or容器对象)。对于庞大的图形系统,这无疑是非常复杂的! 解决方法:Compos... 阅读全文
posted @ 2012-01-14 11:13 __Shadow 阅读(1775) 评论(0) 推荐(0) 编辑
摘要:Bridge模式一 意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化。 (类设计的开闭原则:对扩展开放,对修改关闭)二 动机 看看文章中的例子:可移植的window的抽象部分的实现,及其扩展的方式 1 如需增加新的类型window就必须要重新增加新的window类, 且仍然要区分对应平台的window类型,如果要是新增加一个平台,那整个结构都需要重新添加新的window类型。 2 继承机制使得客户代码与平台相关。XWindow对象的实现方式仅支持在XWindow平台上运行,包括其所扩展的对象, 都只能在XWindow平台上运行,如果要在PMWindow上... 阅读全文
posted @ 2012-01-12 14:11 __Shadow 阅读(799) 评论(1) 推荐(0) 编辑
摘要:Adapter模式一 意图 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。二 动机 为复用而设计的通用的类,总是存在一些特殊的情况,使其不能够使用或者完成相应的扩展性的功能。看文中所给的例子:绘图编辑器中新增加文本图形编辑 TextView是呈现文本的,并不支持图形编辑的方式,新增加TextShape,是无法直接使用TextView中的方法,但同时还要存在Shape的操作,或许还要新增加特性或者操作,这些都要求必须要新增加一个类来完成这些功能。为了能够使用到TextView中已经存在对于文本... 阅读全文
posted @ 2012-01-10 17:44 __Shadow 阅读(1026) 评论(0) 推荐(0) 编辑
摘要:一 创建型模式1 创建型模式抽象了实例化的过程 将对象的创建,组合,表示独立于系统。一个类创建型模式使用继承来改变被实例化的对象,一个对象的创建型模式是将实例化委托给另一个对象,以避免硬编码(hard_coding)带来了的不可扩展和不能灵活应对变化,而来降低对象之间关系的重新更改或者组合或者复合所带来的复杂性。 创建型模式是解决对象实例化问题:由谁创建,怎么创建……二 创建型模式之间的比较1 AbstractFactory模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们具体的类。将一个完整的产品创建,委托给AbstractFactory,将完整产品拆分成许多相关或者... 阅读全文
posted @ 2012-01-07 16:44 __Shadow 阅读(669) 评论(0) 推荐(0) 编辑
摘要:Singleton一 意图 保证一个类仅有一个实例,并提供一个访问的全局访问点。二 结构 为什么需要仅有一个类的单例类呢?在很多种情况下,一个系统只需要此类的一个实例就够了:一个窗口管理器,一个消息通知器,一个数据存储器…… 有时候只能有一个:系统共用一个存储器,很多地方访问到存储器,必须要保证存储器唯一。三 代码实现class Singleton{protected: Singleton() { cout<<"Singleton constructor"<<endl; }public: static Singleton* getInstan... 阅读全文
posted @ 2012-01-04 20:03 __Shadow 阅读(392) 评论(0) 推荐(0) 编辑
摘要:Prototype一 意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。二 动机 在图形编辑器中增加音符编辑构造乐谱编辑器的例子中。GraphicTool作为图形编辑器的框架,其中提供了可以添加的图形;Graphic作为图形类的基类,新增加的音乐相关符号也都从Graphic派生。要实现乐谱构造器,需要新增加图形,供GraphicTool添加使用。 如果仅仅是增加新的Graphic派生类,并且再对每一个Graphic实现copy自己。我想了很久也不知道怎么去实现……增加了新的Graphic派生类,但是GraphicTool仍然是不知道增加了新的图形,要么扩展Grap... 阅读全文
posted @ 2011-12-20 20:59 __Shadow 阅读(677) 评论(0) 推荐(0) 编辑
摘要:Factory Method模式1. 意图定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。2. 动机框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。在多文档框架中,两个主要的抽象是类Application和Document。客户必须通过它们的子类来做与具体应用相关的实现。例如,为创建一个绘图应用,我们定义类DrawingApplication和DrawingDocument。Application类负责管理Document并根据需要创建它们—例如,当用户从菜单中选择Open或N... 阅读全文
posted @ 2011-11-26 17:01 __Shadow 阅读(682) 评论(0) 推荐(1) 编辑
摘要:Buileder(生成器)—对象创建型模式一 意图将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。二 适用性在以下情况使用Build模式:1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2 当构造过程必须允许被构造的对象有不同的表示时。3 Builder模式要解决的也正是这样的问题: 当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成), 我们要复杂对象的创建过程和这个对象的表示(展示)分离开来, 这样做的好处就是通过一步步的进行复杂对象的构建, 由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展... 阅读全文
posted @ 2011-11-21 20:51 __Shadow 阅读(42267) 评论(0) 推荐(4) 编辑