java基础-head first 设计模式

来源:互联网 发布:泰语字母发音软件 编辑:程序博客网 时间:2024/06/05 16:56
1、第一个设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
解释:如果每次新的需求一来,都会是某方面的代码发生变化,那么你就可以确定,这部分的代码需要被抽出来,和其他稳定的代码有所区分。
或是:把变化的部分取出来封装起来,以变以后可以轻易的改动或扩充此部分,而不影响不需要变化的其他部分。
总之:这几乎是每个设计模式背后的精神所在。
结果:代码变化引起的不经意后果变少,系统变得更有弹性。
2、第二个设计原则:针对接口编程,而不是针对实现编程。
3、问:观察者的依赖是如何产生的?
答:主题是真正拥有数据的人,观察者是主题的依赖者,在数据变化时更新,这样比起让许多对象控制同一份数据来说,可以得到更干净的OO设计。
4、第三个设计原则:为了交互对象之间的松耦合设计而努力。
对于观察者模式,我们可以独立地复用主题或者观察者,如果我们在其他地方需要使用主题或者观察者,可以轻易的复用,因为二者并非紧耦合。改变主题或观察者其中一方,并不会影响另一方。只要他们之间的接口仍被遵守。
5、关于观察者模式:
可以在main中,创建很多个观察者,然后在调用主题的list.add进去。
也可以在观察者的构造函数里,把主题传进去,然后调用主题的list.add和remove方法把自己注册进去。
感觉后者更灵活些,让观察者拥有更多主动权。而且没有影响耦合程度。
6、java内置的观察者模式java.util.Observable是有缺陷的,它是一个类而不是一个接口。这会限制扩展:因为你必须设计一个类继承它,如果想同时再继承另一个超类,java不能支持多继承就不能实现。setChanged()方法被定义成protected,这意味着你除非继承自Observable,否则无法创建Obervable实例并组合到自己的对象中去。
(也就是,想用的话只能继承它,不能组合它,而且继承的时候只能继承它自己,不能继承别人。)
7、第四个设计原则:类应该对扩展开放,对修改关闭。
8、问:如何让设计的每个部分都遵循开闭原则?
答:通常办不到。遵循开闭原则,通常会引入新的抽象层次,增加代码的复杂度。需要把注意力集中在设计中最有可能改变的地方,然后应用开闭原则。这通常需要OO系统设计经验的积累和深入工作领域了解。
9、继承并不总是能够实现最有弹性和最好维护的设计,比如犬吠如果写在超类animal中,但是对于子类猫科就不适合继承。那又怎么能达到复用呢?
答:可以利用组合composition和委托delegation在运行时具有继承的效果。利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态的扩展。可以利用此技巧把多个新职责,甚至是设计超类时还没有想到的职责加在对象上,而且不改变原有的代码。既然没有改变原有的代码,那么引进bug或是产生意外副作用的机会将会大幅度减少。
10、装饰者模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
11、装饰者的关键:装饰者和被装饰者必须是一样的类型,也就有有共同的超类。在这里,我们利用继承达到“类型匹配”,因为装饰者必须能够取代被装饰者,而不是用继承获得行为,行为来自装饰者和基础组件或和其他装饰者之间的组合关系。还因为行为不是来自超类,就是子类覆盖后的版本,如果依赖继承,那么类的行为只能在编译时静态决定,但是利用组合,装饰者就可以在运行时添加新的行为。
12、简单工厂模式,把创建披萨的过程用一个类封装起来有啥好处?首先封装起来的这个类可以为多个客户服务,而且在增加或改变披萨的种类时,只改变这一个类即可,不需要改变其他的地方。一般情况会把这个简单的工厂定义为静态方法,这样就可以直接通过类名调用创建对象的方法,省去创建工厂对象的步骤。但是利用静态方法后,就不能通过继承来改变行为的方法了。
13、工厂模式和抽象工厂模式的主要作用是封装变化,把经常变化的地方封装成一个类。这样可以避免重复,方便维护。使客户代码和实现代码解耦,客户在实例化对象时,依赖于接口,而不是具体的实现类。具体可以查看 http://blog.csdn.net/gghh2015/article/details/78444036
14、单例模式处理多线程的问题,有三种方法:1)懒汉模式使用同步getInstance()方法,2)使用饿汉模式,3)懒汉模式使用双重锁。具体可查看 http://blog.csdn.net/gghh2015/article/details/78444347
15、命令模式把命令的请求者和执行者解耦,她把命令的执行者和动作封装在一起作为一个命令,通常这些命令会放在一个队列里,这样请求者就可以在不用了解命令具体动作的情况下,依次执行每个命令。这样的应用有,线程池、工作队列、日程安排等。
16、适配器模式,适配器实现了目标接口,并引用一个被适配者。
在工作中,新接口的适配,用适配器类实现新接口并引用被适配者。新类的适配,用适配器类继承新的类,并引用被适配者。
17、适配器模式、装饰者模式、外观模式的区别:个人认为,适配器是横向的转换接口,而装饰是纵向的包装接口。适配器将一个对象包装起来以改变其接口,装饰者将一个对象包装起来以增加新的行为和责任,外观模式将一群对象“包装”起来以简化其接口。
18、第五个设计原则:最少知识原则,只和你的密友谈话。具体可查看:http://blog.csdn.net/gghh2015/article/details/78445744