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

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. TCP释放连接的四次挥手过程

    TCP断开连接的过程:TCP四次挥手. 数据传输结束后,通信的双方都可释放连接.现在A和B都处于ESTABLISHED状态.A的应用进程先向TCP发出连接释放报文段,主动关闭TCP连接.A把连接释放报 ...

  2. Redis通用操作(适用于String,Hash,链表等)

    keys pattern 查询相应的key 在redis里,允许模糊查询key 有3个通配符 *, ? ,[] *: 通配任意多个字符 ?: 通配单个字符 []: 通配括号内的某1个字符 redis ...

  3. logstash_agent.conf 语法注意事项

    编写配置文件时要注意语法,如新版本的logstash对参数host变更为hosts,去除了port参数等. [root@localhost logstash]# cat logstash_agent. ...

  4. 二维码工具类 - QrcodeUtils.java

    二维码工具类,提供多种生成二维码.解析二维码的方法,包括中间logo的二维码等方法. 源码如下:(点击下载 - QrcodeUtils.java.MatrixToImageWriterEx.java. ...

  5. 微信朋友圈如何同时分享(图片+文字) Android版

    以下是:微信朋友圈SDK 分享图片的代码,但只能分享图片,不能分享文字,如何才能图片和文字同时分享?求各位大神指教! public class MainActivity extends Activit ...

  6. Android之项目推荐使用的第三方库

    1. 使用上拉更多,下拉刷新:https://github.com/JosephPeng/XListView-Android 这个是github上面更为火爆的:https://github.com/c ...

  7. Android 用户界面---拖放(Drag and Drop)(一)

    用Android的拖放框架,能够允许用户使用图形化的拖放手势,把数据从当前布局中的一个View对象中移到另一个View对象中.这个框架包括:拖拽事件类.拖拽监听器.以及辅助的方法和类. 尽管这个框架主 ...

  8. Linux进程控制(三)

    1. 进程间打开文件的继承 1.1. 用fork继承打开的文件 fork以后的子进程自动继承了父进程的打开的文件,继承以后,父进程关闭打开的文件不会对子进程造成影响. 示例: #include < ...

  9. UVa 10054 (打印欧拉回路) The Necklace

    将每个颜色看成一个顶点,对于每个珠子在两个颜色之间连一条无向边,然后求欧拉回路. #include <cstdio> #include <cstring> + ; int G[ ...

  10. NBUT 1122 Shameimaru's Candid Camera(水)

    题意: 给n*m个格子,初始时每个格子中有个数值为0,部分格子中含有炸弹,每个炸弹爆炸可以将周围的8个非炸弹格子中的数值加1,求全部炸弹炸完后那些非0且非炸弹格子中的数是多少. 思路: 另开一个矩阵, ...