随笔分类 -  设计模式 design patterns

摘要:访问者模式的目的: 封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。 问题的提出:System.Collection命名空间下提供了大量集合操作对象。平时我们大多在集合中都是存储的同类型对象,像2.0中的泛型中就规定集合中只能存储指定的对象类型,要么是整形要么是字符型等,否则会报错。如果针对一个保存有不同类型对象的聚集采取某种操作该怎么办呢? 示例:假设有一个员工报销的集合,里面存储了员工姓名和报销金额情况,而报销数据类型并不统一,有的是整形的,有的是双精度的,有的是字符串型,我们要做的就是根据具体的数据类型给出不同的显示格式,例如在整 阅读全文
posted @ 2011-12-02 16:35 Flying Dreams 阅读(191) 评论(0) 推荐(0)
摘要:问题描述:往往人们购买车子不是去生产工厂里面去买,而是去汽车的代理商那儿去购买,这个代理商的作用跟代理模式中描述的作用是一样的。类的设计思路如下:1、接口ICarSeller:是类CarProxy与类CarProducer的抽象,提供方法sellCars(int cars)2.类CarProxy:汽车代理商,当自己的库存足够的时候,自己直接与消费者交易;当自己的库存不足的时候,首先需要向汽车生产商购买足够的汽车,然后再将汽车卖给消费者,提供了sellCars与buyCars两个方法。实例变量numberOfCars记录代理商的库存量,并且拥有对汽车生产商的引用。3.类CarProducer:汽 阅读全文
posted @ 2011-12-01 16:55 Flying Dreams 阅读(285) 评论(0) 推荐(0)
摘要:设计模式总结性试题1、设计模式一般用来解决什么样的问题( a) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是2、下列属于面向对象基本原则的是( c ) A.继承 B.封装 C.里氏代换 D都不是3、Open-Close原则的含义是一个软件实体( a ) A.应当对扩展开放,对修改关闭. B.应当对修改开放,对扩展关闭 C.应当对继承开放,对修改关闭 D.以上都不对4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( a )模式。 A.创建型 B.结构型 C行为型 D.以上都可以5、要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编 阅读全文
posted @ 2011-12-01 15:20 Flying Dreams 阅读(1980) 评论(0) 推荐(0)
摘要:在网页http://topic.csdn.net/u/20090916/00/8204215a-73c8-4939-9ccf-258ded13e33f.html上看到一道面试题,如下:利用Java中的接口来实现设计模式中的策略模式,需要编写程序如下: public interface Relation{ boolean Releation(int a,int b); } 利用上述接口,编写一个函数 IntGetMaxChainLen(int[] intArray,Relation relation); intArray为一个整形数组,该数组中,假如相令俩整数a,b。... 阅读全文
posted @ 2011-12-01 11:38 Flying Dreams 阅读(172) 评论(0) 推荐(0)
摘要:以汽车为例子,对汽车进行染色是必须的步骤,但是如果有些车主还喜欢对车把手或者车内部进行不同的染色(这当然是选择性的步骤),那么就非常适合用装饰者设计模式来设计。设计的代码如下package car.paint;public interface Car {public void paint(String color);}package car.paint;public class ConcreteCar implements Car {private String color ;public void paint(String color) {// TODO Auto-generated met 阅读全文
posted @ 2011-12-01 11:00 Flying Dreams 阅读(116) 评论(0) 推荐(0)
摘要:一、 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java collection的遍历:Iteratorit=list.iterator();while(it.hasNext()){ //using“it.next();”dosomebusinessslogic}而这就是关于迭代器模式应用很好的例子。 二、 定义与结构 迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。很明显,... 阅读全文
posted @ 2011-11-30 10:43 Flying Dreams 阅读(149) 评论(0) 推荐(0)
摘要:命令模式也是开发中常见的一个模式,也不是太难,比较简单,下面来详细的写一下命令模式。命令模式(Command)1 场景问题1.1 如何开机 估计有些朋友看到这个标题会非常奇怪,电脑装配好了,如何开机?不就是按下启动按钮就可以了吗?难道还有什么玄机不成。 对于使用电脑的客户——就是我们来说,开机确实很简单,按下启动按钮,然后耐心等待就可以了。但是当我们按下启动按钮过后呢?谁来处理?如何处理?都经历了怎样的过程,才让电脑真正的启动起来,供我们使用。 先一起来简单的认识一下电脑的启动过程,了解一下即可。当我们按下启动按钮,电源开始向主板和其它设备供电主板的系统BIOS(基本输入输出系统)开始加电后自 阅读全文
posted @ 2011-11-29 16:42 Flying Dreams 阅读(133) 评论(0) 推荐(0)
摘要:一、职责链(Chain of Responsibility)模式责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。从击鼓传花谈起击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。击鼓传花便是责任链模式的应 阅读全文
posted @ 2011-11-29 15:18 Flying Dreams 阅读(155) 评论(0) 推荐(0)
摘要:Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。如下图: 比如说C和A不在一个服务器上,A要频繁的调用C,我们可以在A上做一个代理类Proxy,把访问C的工作交给Proxy,这样对于A来说,就好像在直接访问C的对象。在对A的开发中我们可以把注意力完全放在业务的实现上。 GoF《设计模式》中说道:为其他对象提供一种代理以控 阅读全文
posted @ 2011-11-29 14:49 Flying Dreams 阅读(209) 评论(0) 推荐(0)
摘要:2010-09-20 作者:云飞龙行 来源:云飞龙行的blog来写一个大家既陌生又熟悉的设计模式,也是非常实用的一个设计模式,那就是桥接模式。说陌生是很多朋友并不熟悉这个设计模式,说熟悉是很多人经常见到或者是下意识的用到这个设计模式,只是不知道罢了。桥接模式是非常实用的一个模式,下面就来写写它。 桥接模式(Bridge)1 场景问题1.1 发送提示消息考虑这样一个实际的业务功能:发送提示消息。基本上所有带业务流程处理的系统都会有这样的功能,比如某人有新的工作了,需要发送一条消息提示他。从业务上看,消息又分成普通消息、加急消息和特急消息多种,不同的消息类型,业务功能处理是不一样的,比如加急消息是 阅读全文
posted @ 2011-11-29 14:19 Flying Dreams 阅读(186) 评论(0) 推荐(0)
摘要:2010-09-20 作者:云飞龙行 来源:云飞龙行的blog来写一个大家既陌生又熟悉的设计模式,也是非常实用的一个设计模式,那就是桥接模式。说陌生是很多朋友并不熟悉这个设计模式,说熟悉是很多人经常见到或者是下意识的用到这个设计模式,只是不知道罢了。桥接模式是非常实用的一个模式,下面就来写写它。 桥接模式(Bridge)1 场景问题1.1 发送提示消息考虑这样一个实际的业务功能:发送提示消息。基本上所有带业务流程处理的系统都会有这样的功能,比如某人有新的工作了,需要发送一条消息提示他。从业务上看,消息又分成普通消息、加急消息和特急消息多种,不同的消息类型,业务功能处理是不一样的,比如加急消息是 阅读全文
posted @ 2011-11-28 16:50 Flying Dreams 阅读(200) 评论(0) 推荐(0)
摘要:学习设计模式也有一段时间了,今天就把我整理的一篇课程和大家分享,有不妥之处欢迎指出.生活中的一个例子: 就拿汽车在路上行驶的来说。即有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。这你会发现,对于交通工具(汽车)有不同的类型,然而它们所行驶的环境(路)也在变化,在软件系统中就要适应两个方面的变化?怎样实现才能应对这种变化呢?概述:在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。意图: 将抽象部.. 阅读全文
posted @ 2011-11-28 16:43 Flying Dreams 阅读(130) 评论(0) 推荐(0)
摘要:一. 从树谈起 基本上所有人都知道树这个概念。稍微深究.NET本质的人会懂得,.NET有个对象树。学习ASP.NET的人肯定会知道,Web上有个控件树。哪怕是只学习过数据结构应付考试的大学生也会知道Tree这个概念。二. 把需求扩展成树 举个我们最常用的Photoshop做例子。在Photoshop中,有许多图形工具,比如星星,比如方形,再比如圆形等等。在Photoshop中,不用多说,也有很多种颜色供我们选择。于是就产生了,红色的星星,绿色的星星。红色的方形,绿色的方形等等。看看所产生的树:现在是三种图形,三种颜色,于是我们就一共去声明了九个类,当然我们还不算中间过程中的辅助父类。如果我们现 阅读全文
posted @ 2011-11-28 16:31 Flying Dreams 阅读(337) 评论(0) 推荐(0)
摘要:本文为大家介绍软件设计中的一些原则,都是经过长期经验总结出来的知识,每一个程序员都应该了解,相信对大家在进行软件设计的过程中会有很大帮助。 Don’t Repeat Yourself (DRY) DRY 是一个最简单的法则,也是最容易被理解的。但它也可能是最难被应用的(因为要做到这样,我们需要在泛型设计上做相当的努力,这并不是一件容易的事)。它意味着,当我们在两个或多个地方的时候发现一些相似的代码的时候,我们需要把他们的共性抽象出来形一个唯一的新方法,并且改变现有的地方的代码让他们以一些合适的参数调用这个新的方法。 参考:http://en.wikipedia.org/wiki/KISS_pr 阅读全文
posted @ 2011-11-28 15:54 Flying Dreams 阅读(154) 评论(0) 推荐(0)
摘要:1、定义:原型模式就是通过一个原型对象来表明要创建的对象类型,然后用复制这个对象的方法来创建更痛类型的对象。2、原理:有两部分组成,抽象原型和具体原型。3、使用时机:系统需要 创建吃的对象是动态加载的,而且产品具有一定层次时,可以考虑使用原型模式。1>当要实例化的类是在运行时刻指定时,例如,通过动态装载;2>或者为了避免创建一个与产品类层次平行的工厂类层次时;3>或者当一个类的实例只能有几个不同状态组合中的一种时。4>建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。4、效果:1>可以再运行时刻增加和删除产品。2>可以通过改变值来指 阅读全文
posted @ 2011-11-28 15:50 Flying Dreams 阅读(198) 评论(0) 推荐(0)
摘要:Template Method 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现. 它是一个骨架,在框架的设计中多用此设计模式. 对模板方法进行挂钩: 钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现.钩子的存在, 可以让子灰有能力对算法的不同点进行挂钩.要不要挂钩,由子类自行决定. 好莱坞原则: 高层组件对低层组件的方式是"别调用我们,我们会调用你". Java代码 publicabstractclassCaffeineBeverage{//不希望子类覆盖此方法,声明为finalfinalvoidprepareRecipe(){boilWater 阅读全文
posted @ 2011-11-28 15:18 Flying Dreams 阅读(142) 评论(0) 推荐(0)
摘要:声明:转载抽象工厂是创建一系列的产品供客户代码使用,而生成器模式是生成多个产品后组合成一个产品供客户代码使用。生成器模式可以精确控制产品如何组合。因此在使用产品系列时,采用抽象工厂模式;而在需将将一系列产品组合成一个产品时,使用生成器模式2.Builder与Abstract Factory的区别:刚开始的时候,我也觉得Builder和Abstract Factory差不多,深入了解后才发觉,它们之间也是有区别的,虽然它们都是生成新对象给使用者,也可以创建复杂对象,不过Abstract Factory是立即生成新的对象,有实时性,而Builder则有可能需要多种条件都符合的时候才能生成新的对象. 阅读全文
posted @ 2011-11-28 14:31 Flying Dreams 阅读(1086) 评论(0) 推荐(0)
摘要:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tianli.blog.51cto.com/190322/34089生成器模式属于对象结构型模式,其意图是将一个复杂对象的构建与他的表示分离,使得同样的构建创建过程可以创建不同的表示。适用性:1. 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时2. 当构造过程必须允许被构造的对象有不同的表示时。参与者: 生成器Builder:为创建一个Product对象的各个部件指定抽象接口(AnimalBuilder)。 具体生成器ConcreteBuilder:实现Bu 阅读全文
posted @ 2011-11-28 14:17 Flying Dreams 阅读(407) 评论(0) 推荐(0)
摘要:在网上看见了这篇文章,作者以轻松的语言比喻了java的23种模式,有很好的启发作用。 创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用... 阅读全文
posted @ 2011-11-25 16:54 Flying Dreams 阅读(139) 评论(0) 推荐(0)
摘要:概要 单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化 (serialization)时如何处理这些缺陷。 单例模式适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统,它们都是原型的例子。典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问指针,这便是众所周知的单例模式的应用。当然这只有在你确信你不再需要任何多于一个的实例的情况下。 单例模式的用意在于前一段中所关心的。通 阅读全文
posted @ 2011-11-25 14:49 Flying Dreams 阅读(155) 评论(0) 推荐(0)