代码复用à经验复用
如果每次新的需求一来,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要被抽出来,和其他稳定的代码有所区分.
我们全都使用别人设计好的库和框架,我们谈论库与框架,利用它们的API编译成我们的程序,享受运用别人的代码所带来的优点.看看Java API及它所带来的功能:网络,GUI,IO等.库与框架长久以来,一直扮演着软件开发过程的重要角色,我们从中挑选所要的组件,把它们放进合适的地方.但是, 库与框架无法帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,所以需要设计模式.设计模式告诉我们如何组织类和对象以解决某种问题,而采用这些设计并使它们适合我们特定的应用,是我们的事.
对于观察者模式,有时候,观察者本身也是个主题,即观察者模式的重叠使用.
观察者模式在JDK中常见, 如Swing, JavaBeans, RMI等,甚至有这个模式的实现: Observable(主题, 缺点是个具体类) and Observer(观察者,接口),其提供”推”和”拉”两种方式,即update是否把Observable作为个参数传给观察者,如果是,则是观察者主动拉,直接调用Observable的get方法取得要取的值.
装饰者模式的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()分别待用Enumeration的hasMoreElements(),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, 是这个数组成员要实现的接口, 交由要比较的数组成员自己实现,这就体现了模板方法模式, 上面的排序是算法实现,其中的具体比较实现交由各成员自己完成.
迭代器模式
Collection和Iterator的好处在于,每个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。真正进行网络交互的,序列化和反序列化的就是stub和skeleton.
代理模式的类型有狠多,如:上面提到的远程代理,虚拟代理(如图片代理),动态代理等。
虚拟代理作为创建开销大的对象的代理。虚拟代理经常直到我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。如加载的图片如果很大,会在加载的过程中显示一个进度条之类的提示加载正在进行,这就是代理,当图片加载完后,在显示真正要用的图片。
在动态代理中,应用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. 如果现在不需要,就别做
发表评论
-
Guava学习2
2013-05-21 16:10 2347PART3. Concurrency 加了个Liste ... -
Guava学习1
2013-05-14 15:07 1079Guava项目涵括了好几个 ... -
Spring MVC学习
2013-05-10 14:08 860DispatcherServlet主要用作 ... -
JUC AQS
2013-01-24 09:07 1046一个基于AQS的Synchr ... -
分支预测(Branch Prediction)
2012-12-24 15:36 3364在写代码的时候, ... -
货币组合问题的实现
2012-12-17 16:37 1107问题:有1元,5元,10元,50元,100元的五种货币,任给定 ... -
CLH锁学习
2012-11-28 13:46 5688CLH锁即Craig, Landin, and Hag ... -
java语言的线程安全级别
2012-10-26 14:02 1119java中一个类可能支持的线程安全性级别: 1.非可变的 ... -
Java多线程发展简史(转)
2012-10-08 13:49 787转载自:http://www.raychase.net/698 ... -
读《分布式java应用:基础与实践》
2012-08-14 16:59 817最近将林昊大牛的《分布式java应用:基础与实践》 ... -
Java 并发和NIO的学习计划
2012-07-05 14:27 555基础还是很重要的,并且必须要扎实,同时还要适当延伸出一定的宽度 ... -
同步与异步 阻塞与非阻塞型I/O(转)
2012-07-04 10:57 763同步阻塞IO 在这个 ... -
Java 线程/内存模型的缺陷和增强(转)
2012-06-01 22:08 913Java在语言层次上实现了 ... -
读《你的灯亮着吗》
2012-05-25 20:33 1399这几天翻读了下 ... -
excel大数据量处理小结(excel07)
2012-05-17 21:46 6776前端时间因为项 ...
相关推荐
学习笔记 深入浅出 设计模式,我是学习《深入浅出设计模式》的笔记,精华内容
深入浅出MySQL-读书笔记byCZF深入浅出MySQL-读书笔记byCZF深入浅出MySQL-读书笔记byCZF
NULL 博文链接:https://bosshida.iteye.com/blog/1165049
深入浅出MFC读书笔记3 深入浅出MFC 读书笔记
读书笔记----设计模式
深入浅出MFC读书笔记2 深入浅出MFC 读书笔记
学生读书笔记共享-学生读书笔记共享系统-学生读书笔记共享系统源码-学生读书笔记共享管理系统-学生读书笔记共享管理系统java代码-学生读书笔记共享系统设计与实现-基于springboot的学生读书笔记共享系统-基于Web的...
《深入浅出Hibernate》读书笔记《深入浅出Hibernate》读书笔记《深入浅出Hibernate》读书笔记
《深入浅出DPDK》全书读书笔记.pdf
《深入浅出设计模式》的编写运用许多最新的研究,包括神经生物学、认知科学以及学习理论,这使得《深入浅出设计模式》能够将这些设计模式深深地烙印在你的脑海中,不容易被遗忘。你将会更擅长于解决软件设计中的问题...
深入浅出MFC读书笔记 MFC 深入浅出
学生读书笔记共享-学生读书笔记共享系统-学生读书笔记共享系统源码-学生读书笔记共享管理系统-学生读书笔记共享管理系统java代码-学生读书笔记共享系统设计与实现-基于springboot的学生读书笔记共享系统-基于Web的...
《深入浅出MFC》读书心得,我多年的笔记。
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
J2EE学习笔记--DAO设计模式基础.txt
详细介绍23种设计模式,结合gof设计模式来撰述,通过设计模式定义、组成、适用场景、以及示例等方式来呈现;资源来自设计模式深入浅出整理的笔记
51单片机学习笔记-教程-实验-实用的三本书,深入浅出,循序渐进
深入浅出MFC_简体中文版_侯捷 + 深入浅出MFC笔记(配合原书的好笔记)