笔记-再读深入浅出设计模式

代码复用à经验复用

如果每次新的需求一来,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要被抽出来,和其他稳定的代码有所区分.

我们全都使用别人设计好的库和框架,我们谈论库与框架,利用它们的API编译成我们的程序,享受运用别人的代码所带来的优点.看看Java API及它所带来的功能:网络,GUI,IO.库与框架长久以来,一直扮演着软件开发过程的重要角色,我们从中挑选所要的组件,把它们放进合适的地方.但是, 库与框架无法帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,所以需要设计模式.设计模式告诉我们如何组织类和对象以解决某种问题,而采用这些设计并使它们适合我们特定的应用,是我们的事.

对于观察者模式,有时候,观察者本身也是个主题,即观察者模式的重叠使用.

观察者模式在JDK中常见, Swing, JavaBeans, RMI,甚至有这个模式的实现: Observable(主题, 缺点是个具体类) and Observer(观察者,接口),其提供两种方式,update是否把Observable作为个参数传给观察者,如果是,则是观察者主动拉,直接调用Observableget方法取得要取的值.

 

装饰者模式的JDK应用:java.io

                      Inputstream

      | (实体类)                            |(抽象装饰类)

FileInputStream                         FilterInputStream

StringBufferInputStream                         |(实体装饰类)

ByteArrayInputStream                   PushbackInputStream,BufferedInputStream

DataInputStream,LineNumberInputStream

类似的还有OutputStream, Reader, Writer, 缺点是小类太多,不便理解.

装饰着模式佷好体现了开关原则.

装饰着可以在被装饰着的行为前面或后面加上自己的行为,甚至将被装饰着的行为整个取代掉,而达到特定的目的.

命令模式将请求封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象.目的将请求调用者和请求执行者之间解耦.

当你不想返回一个有意义的对象时,空对象就佷有用.客户也可以将处理null的责任转移给空对象.在许多设计模式中,都会看到空对象的使用.甚至有些时候,空对象本身也被视为是一种设计模式.

命令模式的其他应用:

队列请求: 命令可以将运算打包(一个接收者和一组动作),然后将它传来传去,就像是一般的对象一样,例如:日志安排(Scheduler),线程池,工作队列等.

日志请求:某些应用需要我们将所有的记录都记录在日志中,并能在系统死机之后,重新调用这些动作恢复之前的状态,通过新增两个方法(store(),load()),可以实现.JAVA,我们可以利用对象的序列化(serialization)实现这些方法,但是一般认为序列化最好还是只用在对象的持久化上. 当我们执行命令时,将历史记录储存在磁盘中,一旦系统死机,我们就可以将命令对象重新加载,并成批地一次调用这些对象的execute()方法.

 

JDK早期,collection类型都实现了一个名为elements()的方法,该方法返回一个Enumeration(枚举),该接口可以逐一走过此集合内的每个元素,而无需知道他们在集合内是如何被管理的,其包含的方法有hasMoreElements(),nextElement(). 后来JDK推出新的集合类,使用Iterator接口,其跟Enumeration佷像,还提供了删除功能:

hasNext(), next(), remove(), 但对遗留代码(使用Enumeration),我们就可以用适配器模式,外面是adapter实现Iterator, Enumeration作为其一个属性, hasNext(), next()分别待用EnumerationhasMoreElements(),nextElement().

 

外观模式只是提供更直接简单的操作,并未将原来的子系统阻隔起来.如果你需要子系统的更高层功能,还是可以使用原来的子系统.

外观模式除了简化接口优点外,也允许你将客户实现从任何子系统中解耦.

 

适配器模式:改变接口符合客户的期望

外观模式:提供子系统的一个简化接口

 

最少知识原则(迪米特法则):

一些方针,在对象内,我们应该只调用属于以下范围的方法:

1.       该对象本身

2.       被当作方法的参数而传递进来的对象

3.       此方法所创建或实例化的任何对象

4.       对象的任何组件

 

如果模板方法模式中,抽象类的算法骨架中的各个步骤在子类的实现中都不一样,那就可以用策略模式来代替了.

模板方法中有个技巧是钩子,其可以让一些步骤在抽象类里提供默认实现或空实现,子类可以决定是否覆盖(如果是abstract方法的话是必须覆盖的), 钩子还可以影响算法的结构步骤,佷有用.

工厂方法是模板方法的一种特殊版本.

 

依赖倒置和好莱坞原则:

依赖倒置原则教我们尽量避免使用具体类,而多使用抽象.而好莱坞原则是用在创建框架或组件上的一种技巧,好让低层组件能够贝挂钩进计算中,而又不会让高层组件依赖低层组件(如模板方法模式).两者的目标都是解耦,但是依赖倒置原则更加注重如何在设计中避免依赖.好莱坞原则教我们一个技巧,创建一个有弹性的设计,允许低层结构能互相操作,而又防止其他类太多依赖他们.

模板方法在JDK排序中的使用:

public static void sort(Object[] a){

       Object aux[] = (Object[])a.clone();

       mergeSort(aux, a, 0, a.length, 0);

}

public static void mergeSort(Object src[], Object dest[], int low, int hight, int off){

       for(int j=I; j>low && ((Comparable)dest[j-1].compareTo((Comparable)dest[j])>0; j--)

       {

       Swap(dest, j, j-1);

       }

       Return;

}

第二个方法中的Comparable, 是这个数组成员要实现的接口, 交由要比较的数组成员自己实现,这就体现了模板方法模式, 上面的排序是算法实现,其中的具体比较实现交由各成员自己完成.

 

迭代器模式

CollectionIterator的好处在于,每个Collection都知道如何创建自己的Iterator.只要调用ArrayList上的iterator(),就可以返回一个具体的Iterator, 而你根本不需要知道或关心到底使用了哪个具体类,你只要使用他们的Iterator接口就行了.

JDK5中包含了一种新的形式的for语句,for/in, 这可以让你在一个集合或者一个数组中遍历,而且不需要显示创建迭代器.

 

状态模式允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类. 其实现方式就是将状态封装成独立的类.

 

对于RMI,程序员常犯的错误是:

1.       忘了在启动远程服务之前先启动rmiregistry(要用Naming.rebind()注册服务,rmiregistry必须是运行的)

2.       忘了让变量和返回值的类型成为可序列化的类型(这种错误只会在运行时发现)

3.       忘了给客户提供stub

客户和服务器都需要stub类,服务端还需要skeleton类,也需要服务和远程接口。之所以会需要stub类,是因为stub是真正服务的替身,当真正服务被绑定到RMI registry时,其实真正被绑定的是stub。真正进行网络交互的,序列化和反序列化的就是stubskeleton.

 

代理模式的类型有狠多,如:上面提到的远程代理,虚拟代理(如图片代理),动态代理等。

虚拟代理作为创建开销大的对象的代理。虚拟代理经常直到我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。如加载的图片如果很大,会在加载的过程中显示一个进度条之类的提示加载正在进行,这就是代理,当图片加载完后,在显示真正要用的图片。

 

在动态代理中,应用JDK的动态代理,可以得到目标对象的代理,如为PersonBean建立代理:

(PersonBean)Proxy.newProxyInstance(person.getClass().getClassLoader(),

person.getClass().getInterfaces(),

new OwnerInvocationHandler(person));

上面是通过给定一个PersonBean类型的实力person,获得其代理对象,给其他人使用(JDK只支持有接口实现的代理),而OwnerInvocationHandler则是代理拦截要做的操作的类。

代理类有个静态方法,叫做isProxyClass(),可以用来判断其是不是代理类。而且代理类会实现特定类型的接口,也可以用来用作判断是不是个代理类。

 

代理的一些使用:

防火墙代理:控制网络资源的访问,保护主题免于“坏客户”的侵害

智能引用代理:当主题被引用时,进行额外的动作,例如计算一个对象被引用的次数

缓存代理:为开销大的运算结果提供暂时的存储,它为多个客户共享结果,以减少计算或网络延迟。

同步代理:在多线程的情况下为主题提供安全的访问

隐藏复杂代理:用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称为外观代理,这不难理解。复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口

写入时复制代理:用来控制对象的复制,方法是延迟对象的复制,直到客户真的需要为止。这是虚拟代理的变体。

 

模型除了创建型,行为型,结构型分类。还有另一种:他所处理的对象是类或者对象

类模型描述类之间的关系如何通过继承定义。类模型的关系是在编译时建议的。

对象模式描述对象之间的关系,而且主要是利用组合定义。对象模型的关系通常在运行时建立,而且更加动态,更有弹性。

 

一些建议:

1.       keep it simple

2.       重构的时间就是模式的时间

3.       拿掉你所不需要的,不要害怕将一个设计模式从你的设计中删除

4.       如果现在不需要,就别做

 

 

书籍目录 目录 第1章基本概念 1 1.1什么是设计模式 2 1.2设计模式的作用 3 1.3GRASP模式的分类 4 1.4GoF设计模式的分类 4 1.5模式的学习阶段 6 第2章负责任地设计对象——GRASP 9 2.1InformationExpert(信息专家) 11 2.2Creator(创造者) 13 2.3LowCoupling(低耦合) 14 2.4HighCohesion(高内聚) 15 2.5Controller(控制器) 17 2.6Polymorphism(多态) 18 2.7PureFabrication(纯虚构) 19 2.8Indirection(间接) 20 2.9ProtectedVariations(受保护变化) 21 第3章GoF-CreationalDesignPatterns创建型设计模式 23 3.1SimpleFactoryPattern(简单工厂模式) 24 3.1.1定义 24 3.1.2现实例子——国旗生产厂 26 3.1.3C#实例1——电子付款系统 26 3.1.4C#实例2——学校登录系统 29 3.1.5Java实例——手机简单工厂 32 3.1.6优势和缺陷 34 3.1.7应用情景 34 3.2FactoryMethodPattern(工厂方法模式) 35 3.2.1定义 35 3.2.2现实例子——兵工厂 36 3.2.3C#实例——多文档系统 37 3.2.4Java实例——扩展了的手机工厂 41 3.2.5优势和缺陷 44 3.2.6应用情景 44 3.3AbstractFactoryPattern(抽象工厂模式) 45 3.3.1定义 45 3.3.2现实例子——扩展了的兵工厂 48 3.3.3C#实例——大陆生态系统 49 3.3.4Java实例——电脑产品 52 3.3.5优势和缺陷 57 3.3.6应用情景 57 3.4BuilderPattern(建造者模式) 58 3.4.1定义 58 3.4.2现实例子——快餐店 60 3.4.3C#实例——车间造车 61 3.4.4Java实例——建造房屋 65 3.4.5优势和缺陷 69 3.4.6应用情景 70 3.5PrototypePattern(原型模式) 70 3.5.1定义 70 3.5.2现实中的拷贝-粘贴 71 3.5.3C#实例——颜色管理器 72 3.5.4Java实例——简单ToolBar 74 3.5.5ShallowCopy与DeepCopy 76 3.5.6优势和缺陷 82 3.5.7应用情景 82 3.6SingletonPattern(单例模式) 82 3.6.1定义 82 3.6.2现?抵械牡ダ??猈indowsTaskManager 83 3.6.3C#实例——负载均衡控制器 84 3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6优势和缺陷 93 3.6.7应用情景 93 第4章GoF-StructuralDesignPatterns结构型设计模式 95 4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 102 4.1.5优势和缺陷 104 4.1.6应用情景 104 4.2BridgePattern(桥接模式) 104 4.2.1定义 104 4.2.2现实中的实例——男人的约会 106 4.2.3C#实例——商业对象与数据对象 107 4.2.4Java实例——不同系统的图像处理 112 4.2.5优势和缺陷 114 4.2.6应用情景 115 4.3CompositePattern(组合模式) 115 4.3.1定义 115 4.3.2组合模式的现实应用——资源管理器 117 4.3.3C#实例——图形树状对象结构 118 4.3.4Java实例——文档格式化 121 4.3.5优势和缺陷 124 4.3.6应用情景 125 4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2现实中的实例——顾客服务员 135 4.5.3C#实例——抵押申请审核 136 4.5.4Java实例——冲茶 139 4.5.5优势和缺陷 143 4.5.6应用情景 143 4.6FlyweightPattern(轻量级模式) 144 4.6.1定义 144 4.6.2实例——中游的四国军棋 146 4.6.3C#实例——文档编辑器 147 4.6.4Java实例——装载图像 151 4.6.5优势和缺陷 154 4.6.6应用情景 154 4.7ProxyPattern(代理模式) 154 4.7.1定义 154 4.7.2几个现实中的实例 156 4.7.3C#实例——数学代理 158 4.7.4Java实例——Socket回声 160 4.7.5优势和缺陷 165 4.7.6应用情景 165 第5章GoF-BehavioralDesignPatterns行为型设计模式 167 5.1ChainofResponsibility(责任链模式) 168 5.1.1定义 168 5.1.2现实中的实例——军情的传递 169 5.1.3C#实例——采购分级审批 170 5.1.4Java实例——智能大厦安全系统 174 5.1.5优势和缺陷 178 5.1.6应用情景 178 5.2CommandPattern(命令模式) 179 5.2.1定义 179 5.2.2现实中的实例——餐馆订菜 180 5.2.3C#实例——简单计算器 181 5.2.4Java实例——总开关 185 5.2.5优势和缺陷 189 5.2.6应用情景 189 5.3InterpreterPattern(解释器模式) 190 5.3.1定义 190 5.3.2现实示例——音乐符号 192 5.3.3C#实例——中国金钱大写转换 192 5.3.4Java实例——自定义程序解释器 197 5.3.5优势和缺陷 204 5.3.6应用情景 205 5.4IteratorPattern(迭代器模式) 205 5.4.1定义 205 5.4.2现实示例——电视节目选择器 206 5.4.3C#实例——遍历例子 207 5.4.4Java实例——两个迭代器 211 5.4.5优势和缺陷 213 5.4.6应用情景 214 5.5MediatorPattern(中介者模式) 214 5.5.1定义 214 5.5.2现实示例——机场控制塔 215 5.5.3C#实例——聊天室 216 5.5.4Java实例——多线程通信 220 5.5.5优势和缺陷 223 5.5.6应用情景 223 5.6MementoPattern(备忘录模式) 223 5.6.1定义 223 5.6.2现实示例——音响均衡器 226 5.6.3C#实例——销售目标 226 5.6.4Java实例——多次Undo(取消)操作 231 5.6.5优势和缺陷 236 5.6.6应用情景 236 5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 5.7.7应用情景 248 5.8StatePattern(状态模式) 248 5.8.1定义 248 5.8.2现实例子——心情好坏 250 5.8.3C#实例——账户分类 250 5.8.4Java实例——汽车的变速档 258 5.8.5优势和缺陷 261 5.8.6应用情景 261 5.9StrategyPattern(策略模式) 261 5.9.1定义 261 5.9.2现实例子——去机场的策略 263 5.9.3C#实例——排序方法 263 5.9.4Java实例——多格式输出 266 5.9.5优势和缺陷 272 5.9.6应用情景 272 5.10TemplateMethodPattern(模板方法模式) 272 5.10.1定义 272 5.10.2现实例子——厨师烹调 274 5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用情景 280 5.11VisitorPattern(访问者模式) 280 5.11.1定义 280 5.11.2现实例子——收银员收银计费 282 5.11.3C#实例——人事评估 283 5.11.4Java实例——维修工程师检查车辆 287 5.11.5优势和缺陷 291 5.11.6应用情??291 第6章模式的综合应用 293 6.1Java实例——扩展的日志记录器 294 6.2C#实例——存储分析器 298 6.3用模式生成程序架构 316 附录1自测题 321 附录2自测题答案 331 参考文献 337
真正电子版 不是扫描的 可以转为word或者txt 书籍目录 目录 第1章基本概念 1 1.1什么是设计模式 2 1.2设计模式的作用 3 1.3GRASP模式的分类 4 1.4GoF设计模式的分类 4 1.5模式的学习阶段 6 第2章负责任地设计对象——GRASP 9 2.1InformationExpert(信息专家) 11 2.2Creator(创造者) 13 2.3LowCoupling(低耦合) 14 2.4HighCohesion(高内聚) 15 2.5Controller(控制器) 17 2.6Polymorphism(多态) 18 2.7PureFabrication(纯虚构) 19 2.8Indirection(间接) 20 2.9ProtectedVariations(受保护变化) 21 第3章GoF-CreationalDesignPatterns创建型设计模式 23 3.1SimpleFactoryPattern(简单工厂模式) 24 3.1.1定义 24 3.1.2现实例子——国旗生产厂 26 3.1.3C#实例1——电子付款系统 26 3.1.4C#实例2——学校登录系统 29 3.1.5Java实例——手机简单工厂 32 3.1.6优势和缺陷 34 3.1.7应用情景 34 3.2FactoryMethodPattern(工厂方法模式) 35 3.2.1定义 35 3.2.2现实例子——兵工厂 36 3.2.3C#实例——多文档系统 37 3.2.4Java实例——扩展了的手机工厂 41 3.2.5优势和缺陷 44 3.2.6应用情景 44 3.3AbstractFactoryPattern(抽象工厂模式) 45 3.3.1定义 45 3.3.2现实例子——扩展了的兵工厂 48 3.3.3C#实例——大陆生态系统 49 3.3.4Java实例——电脑产品 52 3.3.5优势和缺陷 57 3.3.6应用情景 57 3.4BuilderPattern(建造者模式) 58 3.4.1定义 58 3.4.2现实例子——快餐店 60 3.4.3C#实例——车间造车 61 3.4.4Java实例——建造房屋 65 3.4.5优势和缺陷 69 3.4.6应用情景 70 3.5PrototypePattern(原型模式) 70 3.5.1定义 70 3.5.2现实中的拷贝-粘贴 71 3.5.3C#实例——颜色管理器 72 3.5.4Java实例——简单ToolBar 74 3.5.5ShallowCopy与DeepCopy 76 3.5.6优势和缺陷 82 3.5.7应用情景 82 3.6SingletonPattern(单例模式) 82 3.6.1定义 82 3.6.2现?抵械牡ダ??猈indowsTaskManager 83 3.6.3C#实例——负载均衡控制器 84 3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6优势和缺陷 93 3.6.7应用情景 93 第4章GoF-StructuralDesignPatterns结构型设计模式 95 4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 102 4.1.5优势和缺陷 104 4.1.6应用情景 104 4.2BridgePattern(桥接模式) 104 4.2.1定义 104 4.2.2现实中的实例——男人的约会 106 4.2.3C#实例——商业对象与数据对象 107 4.2.4Java实例——不同系统的图像处理 112 4.2.5优势和缺陷 114 4.2.6应用情景 115 4.3CompositePattern(组合模式) 115 4.3.1定义 115 4.3.2组合模式的现实应用——资源管理器 117 4.3.3C#实例——图形树状对象结构 118 4.3.4Java实例——文档格式化 121 4.3.5优势和缺陷 124 4.3.6应用情景 125 4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2现实中的实例——顾客服务员 135 4.5.3C#实例——抵押申请审核 136 4.5.4Java实例——冲茶 139 4.5.5优势和缺陷 143 4.5.6应用情景 143 4.6FlyweightPattern(轻量级模式) 144 4.6.1定义 144 4.6.2实例——中游的四国军棋 146 4.6.3C#实例——文档编辑器 147 4.6.4Java实例——装载图像 151 4.6.5优势和缺陷 154 4.6.6应用情景 154 4.7ProxyPattern(代理模式) 154 4.7.1定义 154 4.7.2几个现实中的实例 156 4.7.3C#实例——数学代理 158 4.7.4Java实例——Socket回声 160 4.7.5优势和缺陷 165 4.7.6应用情景 165 第5章GoF-BehavioralDesignPatterns行为型设计模式 167 5.1ChainofResponsibility(责任链模式) 168 5.1.1定义 168 5.1.2现实中的实例——军情的传递 169 5.1.3C#实例——采购分级审批 170 5.1.4Java实例——智能大厦安全系统 174 5.1.5优势和缺陷 178 5.1.6应用情景 178 5.2CommandPattern(命令模式) 179 5.2.1定义 179 5.2.2现实中的实例——餐馆订菜 180 5.2.3C#实例——简单计算器 181 5.2.4Java实例——总开关 185 5.2.5优势和缺陷 189 5.2.6应用情景 189 5.3InterpreterPattern(解释器模式) 190 5.3.1定义 190 5.3.2现实示例——音乐符号 192 5.3.3C#实例——中国金钱大写转换 192 5.3.4Java实例——自定义程序解释器 197 5.3.5优势和缺陷 204 5.3.6应用情景 205 5.4IteratorPattern(迭代器模式) 205 5.4.1定义 205 5.4.2现实示例——电视节目选择器 206 5.4.3C#实例——遍历例子 207 5.4.4Java实例——两个迭代器 211 5.4.5优势和缺陷 213 5.4.6应用情景 214 5.5MediatorPattern(中介者模式) 214 5.5.1定义 214 5.5.2现实示例——机场控制塔 215 5.5.3C#实例——聊天室 216 5.5.4Java实例——多线程通信 220 5.5.5优势和缺陷 223 5.5.6应用情景 223 5.6MementoPattern(备忘录模式) 223 5.6.1定义 223 5.6.2现实示例——音响均衡器 226 5.6.3C#实例——销售目标 226 5.6.4Java实例——多次Undo(取消)操作 231 5.6.5优势和缺陷 236 5.6.6应用情景 236 5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 5.7.7应用情景 248 5.8StatePattern(状态模式) 248 5.8.1定义 248 5.8.2现实例子——心情好坏 250 5.8.3C#实例——账户分类 250 5.8.4Java实例——汽车的变速档 258 5.8.5优势和缺陷 261 5.8.6应用情景 261 5.9StrategyPattern(策略模式) 261 5.9.1定义 261 5.9.2现实例子——去机场的策略 263 5.9.3C#实例——排序方法 263 5.9.4Java实例——多格式输出 266 5.9.5优势和缺陷 272 5.9.6应用情景 272 5.10TemplateMethodPattern(模板方法模式) 272 5.10.1定义 272 5.10.2现实例子——厨师烹调 274 5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用情景 280 5.11VisitorPattern(访问者模式) 280 5.11.1定义 280 5.11.2现实例子——收银员收银计费 282 5.11.3C#实例——人事评估 283 5.11.4Java实例——维修工程师检查车辆 287 5.11.5优势和缺陷 291 5.11.6应用情??291 第6章模式的综合应用 293 6.1Java实例——扩展的日志记录器 294 6.2C#实例——存储分析器 298 6.3用模式生成程序架构 316 附录1自测题 321 附录2自测题答案 331
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值