摘要:
第十一个模式:代理模式 11.1问题引入 远程代理的角色: 远程代理就好比“远程对象的本地代表”。所谓“远程对象”?这是一种对象,活在不同的JVM堆中。所谓“本地代表”?这是一种可以由本地方法调用的对象,其行为会转发到远程对象中。 11.2解决方案: 1.制作远程接口: 远程接口定义出可以让客户远程调用的方法。客户用它作为服务的类型。Stub和实际服务都实现此接口。 package net.... 阅读全文
摘要:
第十个模式:状态模式 10.1问题引入 我们在这里所讨论的是一个通用的技巧:如何对对象内的状态建模-通过创建一个实例变量来持有状态值,并在方法内书写条件代码来处理不同的状态。 糖果机的问题: 这样的设计,会出现以下的问题: 10.2解决方案: 定义状态接口和类: 定义每个状态类: 。。。。。。。。。。。。。 然后,定义GumballMachine类: 我们可以看到,这样可以实现哪... 阅读全文
摘要:
第九个模式:迭代器与组合模式 9.1问题引入: 我要需要创建一个对象,将它称为迭代器(Iterator),利用它来封装“遍历集合内的每个对象的过程”。想让我们在ArrayList上试试: 将它也在数组上试试: 9.2会见迭代器模式 关于迭代器模式,我们需要知道的就是它依赖于一个名为迭代器的接口。一旦我们有了这个接口,就可以为各种对象集合实现迭代器:数组、散列表、列表····如果我们想要为数组实... 阅读全文
摘要:
第七个模式:适配器模式与外观模式 7.1问题引入 对于去欧洲旅行的美国旅客,需要注意的是欧洲标准的插座与美国的标准插座是不同的,所以需要引入适配器。同样,OO适配器和真实世界的适配器扮演同样的角色:将一个接口转换成另一个接口,以符合客户的期望。 7.2面向对象适配 让我们来看看使用中的适配器。以第一章中的鸭子为例,鸭子接口和类如下图: 绿头鸭是鸭子的子类: 然后,再看最新的“火鸡”接口: 现... 阅读全文
摘要:
第六个模式:命令模式 6.1问题引入 命令模式可以将“动作的请求者”从“动作的执行者”对象中解耦。 下面是命令模式下遥控器-电灯的类图: 以下是测试代码: 6.2命令模式 命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。 阅读全文
摘要:
第五个模式:单件模式 5.1问题引入: 有一些对象我们其实只需要一个,比方说:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机、显卡等设备的驱动程序的对象。 5.2解决方案1: 单件模式:确保一个类只有一个实例,并提供一个全局访问点 让我们来看看代码:getInstance()是静态的,这意味着它是一个类方法,所以可以在代码的任何地方使用Singleton.getInsta... 阅读全文
摘要:
第四个模式:工厂模式 4.1写在前面:定义简单工厂模式 简单工厂不是一个设计模式,反而比较像是一种编程习惯。 看看如何根据订单生产这些披萨的: 1.先看看Ethan的订单:我们首先需要一个纽约披萨店: PizzaStore nypizzastore = new NYPizzaStore(); 2.现在有了一个店,可以下单了: nyPizzaStore.orderPizza(“che... 阅读全文
摘要:
第三个模式:装饰者模式 3.1 模式引入 辛巴克咖啡,购买咖啡时,也可以要求在其中加入各种调料,例如:蒸奶(Steamed milk)、豆浆(soy)、摩卡(Mocha)或者覆盖奶泡。星巴克会根据所加入的调料收取不同的费用。所以订单系统必须考虑到这些调料部分。 3.2 解决方案1: 采用继承来实现方案: 这种方案的特点: 1.一旦出现新调料,我们将需要加上新的方法,并改变超类中的cost()方法... 阅读全文
摘要:
第二个模式:观察者模式 1.1问题引入 气象站布告栏,对于注册的用户会实时的报告气候的变化,对于取消注册的用户将不会在推送消息。如下面的模式所示: 推出:出版者+订阅者=观察者模式 出版者=“主题(Subject)”, 订阅者=“观察者(Observer)” 总结: 观察者模式:定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会受到通知并自动更新。 1.2解决方案1 使... 阅读全文
摘要:
第一个模式:策略模式 1.1 问题引入 目标:我们设计了一个鸭子超类,现在有很多鸭子会继承这个超类的行为;同时我们希望有一些鸭子具有不同的行为,比如说能飞翔; 1.2实现方案1: 利用继承来实现Duck的行为。 对于子类中的各种鸭子,如果有不同的行为,需要Override超类的行为; 利用继承的方法会出现以下的结果: 实现方案2:因为并不是所有的鸭子都会叫或者飞翔,所以可以考虑将其提取出来,作... 阅读全文