一句话设计模式
设计模式虽然学了好几年了,但是每次重新去看都会有不一样的领悟。
最早买的一本书是陈杰著的《大话设计模式》,算是自己入门的一本书,因为自己是.net方向,作者也使用c#讲解,浅显易懂,非常适合新手。
后来在知乎有大神推荐《设计模式之禅》,作者使用Java语言,详尽讲解各种应用场景及扩展,以及组合使用,加上自己也要转Java,算是对Java预热学习吧。
不过说实话,虽然学了,但是并没有达到灵活应用,套的最多的就是工厂模式和策略模式。
三月份沉下心来跟着Tom学习设计模式,了解了spring中对各种设计模式的应用,才明白必须跳出局限的思维,开发中不是套用,而是根据7大设计原则合理取舍。
自己的第一个Java项目根据业务合理建模,然后总体采用工厂+策略,最后秉持开闭原则去扩展,发现不知不觉就用到了装饰,模板方法等模式。
总结一下自己对每个模式的理解,算是对这段时间学习的一个总结吧。
- 工厂方法模式:定义创建对象的接口,创建对象延迟到子类中
- 抽象工厂模式:定义产品等级和产品族,有几个等级就有几个工厂类,有几个族就有几个创建方法,是工厂方法的集合
- 单例模式:永远只有一个实例
- 原型模式:默认Object.clone()实现了浅拷贝,深拷贝需要自己实现(理解值类型和引用类型是前提)
- 建造者模式:和工厂模式的区别是注重对象细节的构建顺序,经常结合模板方法模式使用
- 代理模式:为调用方提供代理控制访问,可以在代理类中对目标方法执行前后的过滤、准入等操作(和装饰器的细微差别),是AOP的核心设计
- 适配器模式:通过继承源角色以及实现目标接口,使目标接口适配到了原角色的能力
- 桥接模式:核心是拒绝继承,使用聚合关系封装,使得抽象和实现解耦
- 享元模式:使用享元工厂池化技术获取对象,提取共性作为外部状态(唯一确定一个对象),变化的属性在系统运行时动态改变,带来的好处是减少对象创建避免内存溢出。
- 组合模式:描述部分整体关系的树形结构,透明模式把元素操作方法提取到了抽象类,树枝和树叶都需要实现;安全模式则把操作方法下沉,由树枝和树叶分别决定。
- 委派模式:spring特有的设计模式,代理+策略模式实现,参考spring mvc DispatcherServlet的实现
- 模板方法模式:开发中经常使用的一种模式,抽象类中定义抽象钩子方法和用以编排流程的模板方法,子类通过重写钩子方法实现流程的个性化定制
- 门面模式:子系统访问必须通过Facade类
- 装饰器模式:注重对方法本身的功能进行增强或者减弱,这是和代理模式的差异点,尽管类图相似,但实际使用需要根据这个差别来区分
- 策略模式:一个策略一个类,上下文context如果继承接口则退化成代理模式。
- 责任链模式:每个处理对象保留对下一个对象的引用,形成链式处理结构,结合建造者模式可以对调用方更友好。
- 迭代器模式:由迭代器来提供支持遍历容器或集合中的元素的能力,没落的设计模式!
- 命令模式:N个命令N个类,执行接受相分离
- 状态模式:N个状态N个类,每个状态类维护自身行为以及过渡到其它状态的行为。
- 备忘录模式:备份对象,以供后续恢复(在对象之外保存对象内部状态)
- 中介者模式:即把错综复杂的对象依赖通过中介者解耦,呈现星型发散结构。
- 解释器模式:将语法拆分为终结符表达式和非终结符表达式类,每个终结符对应一个类,比如四则运算,数字是终结符,±×÷是非终结符。
- 观察者模式:也叫发布订阅模式,由被观察者(发布方)除了维护自身行为之外,还要实现增、删、通知观察者的能力。
- 访问者模式:访问者声明访问的对象,被访问者声明接受哪些访问者,访问者可以在不改变被访问者数据的前提下重新定义操作。