想学习基础在数据结构和设计模式之间犹豫了很久,最后还是决定先看一下常用的设计模式 参考书:Design Pattern-Head First 中文版
原则
封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间的松耦合设计努力
对扩展开放,对修改关闭
要依赖抽象,不要依赖具体类
最少知识原则,只和你的密友谈话
由超类控制一切
策略模式:
定义了算法簇,分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的客户
多用组合少用继承,组合既是实现接口
具体做法:声明多个行为接口,用不同的行为实现各个接口。把接口声明组合到一个类中,用令一个类继承该类,用不同的行为实例化父类的声明
抽象类和接口的区别 参考:http://blog.csdn.net/fenglibing/article/details/2745123
1.接口是对动作的抽象,抽象类是对根源的抽象
2.接口是抽象类的变体,接口中所有的方法都是抽象的。抽象类的方法是抽象的,抽象类是声明方法的存在而不是去实现。
3.接口可以多继承,抽象类不能
4.接口定义的方法,自己不能实现。抽象类可以实现部分方法
5.接口中的基本数据类型为static,抽象类不是
观察者模式:
定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。
松耦合
具体做法:定义一个观察者接口,定义一个主题接口,主题中定义注册方法 注销方法,通知方法。观察者中定义可被主题调用的方法
装饰者模式:
动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的代替方案
开闭原则 类应该对扩展开放,对修改关闭
1.装饰者和被装饰对象有相同的超类
2.可以用一个或多个装饰者包装一个对象
3.装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象的场合,可以用装饰过的对象代替它
4.装饰者可以在所委托被装饰者的行为的前后加上自己的行为,以达到特定的目的
5.对象可以在任何时候被装饰,所以可以在运行时动态的不限量的用装饰者装饰对象
工厂模式:
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂模式让类把实例化推迟到子类
java创建对象的几种方式
1.使用new语句创建对象
2.运用反射手段,调用java.lang.Cass或者java.lang.reflect.Constructor类的newInstance()实例方法
Class c = Class.forName(“A”);factory = (AInterface)c.newInstance();
3.调用对象的clone()方法
4.运用发序列化手段,调用java.io.ObjectInputStream对象的readObject()方法
抽象工厂模式:
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
其实就是可以调用不同的实例化工厂类
依赖导致原则
1.变量不可持有具体类的引用
2.不要让类派生自具体类
3.不要覆盖基类中已经实现的方法
工厂模式和抽象工厂模式可以将对象的创建封装起来,以便于得到更松耦合,更有弹性的设计
单例模式:
确保一个类只有一个实例,并提供一个全局访问点
静态变量,静态方法实现
命令模式:
将请求封装成“对象”,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式支持可撤销的操作
把命令执行的对象具体操作方法封装到一个对象中,对外只提供一个执行和撤销接口,使用时把这个封装的对象当作参数传送,执行该参数的“执行”方法就能实现。
当需要将发出请求的对象和执行请求的对象解耦时候,使用命令模式
适配器模式:
将一个类的接口,转换成客户期望的另一个接口哦。适配器让原本接口不兼容的类可以合作无间。
其实就是一个中间件,插座的交换口
外观模式:
提供一个统一的接口,来访问子系统中的一群接口。外观定义一个高层接口,让子系统更容易使用。
最少知识原则:调用发放原则
1.该对象本身
2.被当作方法的参数而传递的对象
3.此方法创建或实例化的任何对象
4.对象的任何组件
适配器的意图是要转换接口
外观模式的意图是统一和简化接口
模版方法模式:
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
迭代器模式:
提供一个方法顺序访问一个聚合对象中的各个元素,而不暴露内部的表示
组合模式:
允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合让客户以一致的方式处理个别对象以及组合对象
声明一个接口,组合对象,个别对象都实现这个接口,提供统一的操作
状态模式:
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类
所有的状态继承相同的“抽象类”
如果需要在一个类中管理状态,状态模式提供了封装状态的技巧
代理模式:
为另一个对象提供替身或者占位符以控制对这个对象的访问