设计模式
文章平均质量分 82
jiajialin
这个作者很懒,什么都没留下…
展开
-
适配器模式(Adapter Pattern)(一):适配器模式介绍
一、意图将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。二、适用性对象需要利用现存的并且接口不兼容的类。需要创建可重用的类以协调其他接口可能不兼容的类。三、组成——目标角色(Target):定义Client客户要使用的特定领域的接口。—原创 2013-05-18 23:14:26 · 3095 阅读 · 1 评论 -
装饰者模式(Decorator Pattern)(二):HeadFirst中咖啡添加调料
一、问题描述为星巴兹咖啡连锁店设计饮料菜单,咖啡可加的调料有豆浆、牛奶、摩卡等。可在咖啡的基础上加入不同的调料,星巴兹会根据所加的调料收取不同的费用,要注意到,以后可能有新的调料被加入进来供顾客选择。并且本店现有DarkRoast(深焙)、HouseBlend(综合)、Decaf(低咖啡因)及Espresso(浓咖啡)四种类型的咖啡,而且以后可能会添加新的咖啡种类。使用装饰原创 2013-05-11 08:47:57 · 2762 阅读 · 0 评论 -
装饰者模式(Decorator Pattern)(一):装饰者模式介绍
一、意图装饰者模式(又称装饰模式、包装(Wrapper)模式):动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。二、适用性以下情况使用Decorator模式(摘自《设计模式》):• 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。• 处理那些可以撤消的职责。• 当不能采用生成子类的方法进行扩充时。原创 2013-05-11 08:45:28 · 4077 阅读 · 0 评论 -
观察者模式(Observer Pattern)(一):观察者模式介绍
一、意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。二、适用性《设计模式》中提到在以下任一情况下可以使用观察者模式:1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。2.当对一个对象的改变需要同时改变原创 2013-05-11 08:49:34 · 5565 阅读 · 0 评论 -
单件模式(Singleton Pattern)(一):单件模式介绍
一、意图 单件模式(又称单例模式)确保一个类只有一个实例,并提供一个全局访问点。二、适用性1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。三、结构四、单件模式的经典实现使用java实现单例模式原创 2013-05-11 09:23:31 · 10664 阅读 · 0 评论 -
策略模式(Strategy Pattern)(二):HeadFirst中鸭子的实现
一、问题描述joe上班的公司做了一套成功的模拟鸭子的游戏:SimUDuck,游戏中会出现各种鸭子,一边游泳,一边呱呱叫,由于公司竞争压力加剧,必须重新设计鸭子(Duck)类,要求是:便于产生新的鸭子对象,可为鸭子添加新的行为,易于维护,动态设置行为。二、类图说明:1.对各种鸭子的解释: RedHeadDuck:红头鸭,可以用翅膀飞,原创 2013-05-11 09:40:48 · 5803 阅读 · 0 评论 -
观察者模式(Observer Pattern)(三):使用java内置的支持实现HeadFirst气象站
一、问题描述Weather-O-Rama气象站计划建立下一代的Internet气象观察站,该气象站必须建立在WeatherData对象的基础上,WeatherData对象提供天气数据,有三种布告板,分别显示目前的状况、气象统计及简单的预报。并且以后可以方便地增加布告板进行扩展。使用观察者模式进行设计,WeatherData对象即观察者模式中的主题对象,三个布告板即观察者。原创 2013-05-11 08:52:13 · 2778 阅读 · 0 评论 -
代理模式(Proxy Pattern)(二):Java API中的动态代理
一、Java动态代理 相对于静态代理的代理类在编译时生成(.class文件),动态代理与其的区别是:动态代理类在运行时在JVM中生成。Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类(实现了InvocationHandler接口)对象,便能动态地获得代理类,避免了静态代理中代理类的急剧膨胀问题。代理类会负责将所有的方原创 2013-05-22 16:41:14 · 4650 阅读 · 0 评论 -
代理模式(Proxy Pattern)(四):HeadFirst中CD封面虚拟代理
一、问题描述当我们在网络上加载一些图像时,限于连接宽带和网络负载,下载可能需要一些时间,所以在等待图像加载的时候,就应该显示一些东西。我们也不希望在等待图像时,整个应用程序被挂起。一旦图像加载完成,刚才显示的东西就应该消失,图像显示出来。二、类图三、实现代码1.ImageComponentclass ImageCo原创 2013-05-28 23:10:52 · 1553 阅读 · 0 评论 -
代理模式(Proxy Pattern)(三):HeadFirst使用java API创建一个保护代理
一、问题描述使用java动态代理根据访问权限控制对客户信息的修改以保护客户信息,客户的信息包括:姓名name、性别gender、interests兴趣爱好、评分HotOrNot(类似于顶或踩),这些信息可以被所有用户看到,只有顾客可以修改自己的name、gender、interests,但是不能修改自己的评分,只能由其他人给他打分。即根据权限控制外界修改客户信息的行为以保护客户信息原创 2013-05-28 23:11:54 · 1812 阅读 · 1 评论 -
模板方法模式(TemplateMethod Pattern)(三):HeadFirst中的咖啡和茶的冲泡
以《HeadFirst设计模式》中的咖啡和茶的冲泡过程的实现为例讲述模板方法模式的应用场景。一、问题描述星巴兹咖师傅的训练手册: 咖啡冲泡法: (1)把水煮沸 (2)用沸水冲泡咖啡 (3)把咖啡倒进杯子 (4)加糖和牛奶 茶冲泡法: (1)把水煮沸 (2)用水浸泡茶叶 (3)把茶倒进杯子 (4)加柠檬二、逐步原创 2013-05-11 09:45:01 · 2576 阅读 · 1 评论 -
模板方法模式(TemplateMethod Pattern)(二):java中模板方法和钩子的使用示例
一、java API中的模板方法的使用1.Arrays.sort()排序在对数组进行排序时,我们常会使用Arrays.sort()方法,Arrays类的sort()方法就是模板方法。模板方法模式的重点在于提供一个算法,并让子类实现某些步骤,但是在Arrays.sort()数组排序时并不是如此,通常我们无法设计一个类继承java数组,而sort()方法希望能够适用原创 2013-05-11 09:43:44 · 3910 阅读 · 0 评论 -
适配器模式(Adapter Pattern)(二):HeadFirst中的火鸡冒充鸭子
一、问题描述火鸡通过模仿鸭子走路的姿势、叫的声音以及飞行就可以将自己伪装成一只鸭子,当我们缺少鸭子对象时,就可以使用一些火鸡对象来冒充鸭子对象,但是我们还必须编写一个接口,使一只火鸡可以通过这个接口(即适配器)装换成一只鸭子。我们可以写一个对象适配器或类适配器将火鸡适配成鸭子。二、类图三、代码实现1.Duck,原创 2013-05-18 23:15:06 · 2233 阅读 · 0 评论 -
命令模式(Command Pattern)(一):命令模式介绍
一、意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。二、适用性(1)系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。(2)在不同的时刻指定、排列和执行请求。(3)支持修改日志、撤销操作。(4)系统需要将一组操作组合在一起原创 2013-05-18 23:16:24 · 6115 阅读 · 0 评论 -
命令模式(Command Pattern)(二):HeadFirst中的遥控器
一、问题描述使用命令模式实现遥控器,遥控器上的不同按钮控制电灯的开关及亮度、天花板风扇的开关及转速等,支持撤销。具体按钮:开灯/关灯按钮、暗光开/关按钮、风扇高速/中速/低速/关按钮、撤销按钮。遥控器如下图所示:遥控器担当请求者(或称为调用者)的角色,用RemoteControlWithUndo类实现,其内有Command[]类型的属性onCommands和offCom原创 2013-05-18 23:15:52 · 2811 阅读 · 0 评论 -
策略模式(Strategy Pattern)(一):策略模式介绍
一、意图 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。二、适用性1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。3、 对客户隐藏具体策略(算原创 2013-05-11 09:39:20 · 1810 阅读 · 0 评论 -
组合模式(Composite Pattern)(一):组合模式介绍
一、意图将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。二、适用性• 你想表示对象的部分-整体层次结构。• 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。三、组成——抽象构件角色(Component):为组合中的对象原创 2013-05-20 22:30:49 · 7278 阅读 · 2 评论 -
组合模式(Composite Pattern)(二):HeadFirst中使用组合设计菜单
一、问题描述使用组合模式为餐厅设计菜单,使服务员Waitress可以很方便地使用菜单。二、类图三、代码实现1.(Component角色)MenuComponentpublic abstract class MenuComponent{ //对一些方法进行了默认实现 public void add(M原创 2013-05-20 22:31:41 · 1936 阅读 · 0 评论 -
代理模式(Proxy Pattern)(一):代理模式介绍
一、意图为其他对象提供一种代理以控制对这个对象的访问。二、适用性使用代理模式的常见的重要情况有:1) 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。比如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。2) 虚拟(Virtual)代理:根据需要将一个资源消耗很大或者比较复杂的对象原创 2013-05-20 22:35:15 · 2047 阅读 · 0 评论 -
观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现
一、问题描述Weather-O-Rama气象站计划建立下一代的Internet气象观察站,该气象站必须建立在WeatherData对象的基础上,WeatherData对象提供天气数据,有三种布告板,分别显示目前的状况、气象统计及简单的预报。并且以后可以方便地增加布告板进行扩展。使用观察者模式进行设计,WeatherData对象即观察者模式中的主题对象,三个布告板即观察者。原创 2013-05-11 08:51:08 · 3854 阅读 · 3 评论 -
单件模式(Singleton Pattern)(二):HeadFirst中的巧克力工厂的设计
以《HeadFirst设计模式》中的巧克力工厂为例,介绍单件模式的使用场景。一、问题描述 现代化的巧克力工厂具备计算机控制的巧克力锅炉,锅炉做的事就是把巧克力和牛奶融在一起,然后送到下一个阶段,以制造成巧克力棒。Choc-O-Holic公司有一个巧克力锅炉控制器用于控制锅炉活动的进行,比如:锅炉内为空时才允许加入原料、锅炉内存在原料并且尚未煮沸时才允许进行煮沸、排出牛奶原创 2013-05-11 09:24:26 · 3883 阅读 · 0 评论 -
模板方法模式(TemplateMethod Pattern)(一):模板方法模式介绍
一、意图 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。二、适用性1.一次性实现一个算法的不变部分,并且将可变的行为留给子类来完成。2.各子类的公共行为应该被提取出来并集中到一个公共父类中以避免代码的重复。首先识别现有代码的不同之处,并且把不同的部分分离为新的操作,最后,用一个这些新的操原创 2013-05-11 09:42:19 · 1209 阅读 · 0 评论