在编写和维护公司的现有代码的时候,我经常思考的问题是:怎样的系统算一个好的系统?如何设计具有扩展、可维护、复用的系统,它能最大限度的应对产品经理不断变化的需求。答案似乎是:设计模式。

Remember , knowing concepts like abstraction, inheritance, and polymorphism do not make you a good object oriented designer. A design guru thinks about how to create flexible designs that are maintainable and that cope with change. 这句话让我印象深刻:仅仅知道Java语言的那些基本特性远远不够,实践一次次论证了这一点。

设计原则:

1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。此处印象最深刻的是Duck类与它们的行为了。

2. 针对接口编程,而不是针对具体实现编程。接口是解耦的第一步。

3. 多用组合,少用继承。组合对象建立的系统具有很大的弹性,它可将算法族封装成类,且“运行时可动态改变”。继承则没有这些优势,当继承子类越来越多时,它造成代码的难以维护。

4. 为了交互对象之间的松耦合设计而努力。松耦合设计让系统具有弹性,它将对象之间的相互依赖降到了最低。(观察者)

5. 类应该对扩展开放,对修改关闭。允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。(装饰者)

6. 要依赖于抽象,不要依赖具体类。(抽象工厂)

7. 最少知识原则:只和你的密友谈话。不要让太多的类耦合到一起,免得修改系统的一个部分会影响到其它部分。(外观与封装)

设计模式:

(一)策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

策略模式将算法独立出来以供Client选择减少了重复,使用组合替代了继承,同时避免了大量的if-else语句。缺点,客户端必须知道具体的策略类,且策略类可能过多。

(二)观察者模式

观察者模式定义了对象之间的一对多依赖,当一个对象状态改变时,所有依赖它的对象都会收到通知并更新。观察者模式=出版者(Subject)+订阅者(Observer)。

(三)装饰者模式

装饰者模式动态的将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。

(四)工厂方法模式

包括工厂方法、抽象工厂方法。

工厂方法:它定义一个创建对象的接口,由其子类决定要实例化的是哪一个。工厂方法通过继承实现,子类会覆盖工厂方法以实现对象的创建。工厂方法将客户端从具体的实现类解耦。

抽象工厂方法:它定义一个接口,用于创建相关或者依赖对象的家族且不需要明确指定具体类。抽象工厂方法通过组合实现,它提供创建一个产品家族的抽象类型,其子类型定义了这个家族产生的具体方法。

(五)单例模式

单例模式确保一个类只有一个实例,并提供一个全局的访问点。

singleton 在多线程环境或者多个类加载器时,若处理不好会产生多个实例。多线程的情形,由一下三种处理:(1)将getInstance()设置为static synchronized (2)直接将uniqueInstance设置为static 并初始化,getInstance中不再需要new操作。(3)将uniqueInstance设置为volatile,并将同步区域缩小至getInstance中的new部分。

(六)命令模式

命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也可以支持可撤销的操作。命令模式可以将“动作请求者”从“动作的执行者”对象中解耦。

(七)适配器模式与外观模式

港版的ipad要充电,但是香港的插座和大陆的不一样,此时,需要一个电源适配器来做转换。

适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

外观模式提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。

适配器试图将一个接口转成另外一个接口;装饰者不改变现有接口,但是它会加入新的责任;外观模式,则让接口变得更加简单(它没有封装子系统的类,客户端可以直接使用子系统的类)。

Java 设计模式学习总结(上)的更多相关文章

  1. Java设计模式学习资源汇总

    本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...

  2. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  3. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  4. Java设计模式学习记录-观察者模式

    前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...

  5. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  6. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  7. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  8. Java设计模式学习记录-命令模式

    前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...

  9. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  10. Java设计模式学习记录-外观模式

    前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...

随机推荐

  1. 美丽渐变色的Form

    一直都非常喜欢渐变色的界面,但是没想到漂亮的渐变Form原来这么简单...实在是没想到...看来我不仅技术水平低,脑袋里的创意也是空空如也... --------------------------- ...

  2. Data Flow ->> Merge

    Merge组件的作用和Union All很相似,就是把两个输入源的结果集合并成一个.但是不同之处在于: 1)Merge输入的结果集需要先经过排序(这点表示怀疑) 2)Merge对于输入的两个结果集的数 ...

  3. PHP,单项查询及多项查询

    先封装对象class DBDA { public $host = "localhost"; //数据库地址 public $uid = "root"; //数据 ...

  4. 创建git标签【转】

    转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137695175857 ...

  5. SQL高性能查询优化语句

    1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null可以在num上设置 ...

  6. 图片处理工具类 - ImageUtils.java

    纯JAVA实现的图片处理工具类,提供图片的裁剪.压缩.获取尺寸.制作圆角等方法. 源码如下:(点击下载 -ImageUtils.java .FolderUtils.java .commons-io-2 ...

  7. 标准类型内建函数 type()介绍

    我们现在来正式介绍一下 type().在Python2.2 以前, type() 是内建函数.不过从那时起,它变成了一个“工厂函数”.在本章的后面部分我们会讨论工厂函数, 现在你仍然可以将type() ...

  8. What is the difference between DAO and DAL?

    What is the difference between DAO and DAL? The Data Access Layer (DAL) is the layer of a system tha ...

  9. mongoDB使用复制还原数据库节省空间

    用db.copyDatabase可以备份复制数据的方法. 1.db.copyDatabase("from","to","127.0.0.1:16161 ...

  10. Map和hash_map

    map和hash_map 今天在写拼流的程序时碰到一个问题,要根据流的四元组的结构信息映射到该流的数据.也就是我在网络数据包拼接的过程中,要根据包的地址和端口信息,对应到其对应的一个流的数据上去,把端 ...