Java与设计模式

设计模式,先看名字,设计,模式,目的是为了设计,为了设计给出一些定义出来的,总结出来的,抽象出来的办法,叫做模式。

设计是什么?软件构建中的设计,承前(需求分析、产品定义、架构选择),启后或者伴随(编码、测试),包含结构、包、类、子程序,而模式讲的就是这些东西。

设计模式是一种思想

这次关于设计模式的分享不是纯技术,是思想。

思想的东西,很难讲,需要听众具备恰当的理解层次,而这种层次的进化,远比一种技术或者工具的进步难以捉摸,有时十年循环不如一夕顿悟。

设计模式是一种思想,是与语言强相关的。

在低级语言(机器、汇编)中,不会有模式;在未来的高级语言中,会从语法层面实现模式(模式本身是语义层面的);在当前广泛使用的高级语言(Java)中,模式被基于解决特定场景的问题,抽取出来,大行其道,广泛使用。

低级语言和高级语言,没有一条分界线,是逐渐进化的。每个程序员都处于其所在的层次上(或者叫境界),处于一个层次,能理解低层次的落后(比如机器语言),但无法理解高层次的先进。这就是《黑客与画家》中所说的Blub困境。

引申到职场、人生和世界观,每个人也都活在自己的抽象层次中,能看懂低层次的落后,但无法理解高层次先进在何处。从境界高低来讲,是有对错的,但如果没有进化到一个层次,也是无法从根本上被说服的,需要到达,才能认知。

面向对象的三大特征

面向对象三大特性:封装、继承、多态。

封装,往往和抽象、高内聚、一致的抽象层次等概念联系在一起。

承是一条竖线,在编程中很常用,但更常用的是包含("has a"),从广义上来说,甚至可以认为"has a",也是一种适配器模式。能用包含,则不用继承,因为继承引入了继承体系上的复杂性。

多态是继承基础上的重写,加上父类变量对子类对象的引用。可以认为多态,是Java这种静态类型语言,向动态类型语言(比如ruby/python),迈出的一小步。

抽象:

抽取事物最本质形成概念。

并运用概念进行推理、判断的思维活动。

抽象交流。

模拟能力,想象能力。

表达能力(口头,文字,文言文和琼瑶剧)。

字、词、句、段.

单例

单例是最重要的一种设计模式。是无状态的逻辑。无状态是应用层实现高可用和可伸缩的重要手段。

单例一:基础

演示了一个最简单的单例、延迟初始化的单例,以及双重检查机制的单例的代码写法。

对于双重检查机制的单例,减小了线程间的碰撞(synchronized),只有前几个线程才可能碰撞,锁的力度小了,性能提高了,线程也安全了。

对于双重检查单例,没有实际意义,只有历史意义,增加Java程序员对于所犯错误的洞察力,如果写单例,有最简单的写法就够了。

过去陈旧的JDBC操作数据库编码过程中,有代码Class.forName("com.mysql.jdbc.Driver"),目的是把类装载到JVM的PermGen区域,这样类的静态方法就可以使用了,这和类的初始化没关系。

显式API初始化也有好处,比如web系统,init写到监听里面去。把初始化放到init里面。清晰了。

单例二:Spring

Java生态中,除了JDK之外,最基础的框架是Spring。Spring框架的高层抽象很多,帮我们解决了很多场景下的技术问题。

Spring的基础的、底层的思想是控制反转(Invest Of Control)、依赖注入(Dependency Injection),可以认为是单例的一种表现形式。说的是两个单例对象之间的关系。

控制反转,反转的控制权,原来是谁用谁有控制权;控制反转的思想是,你可以用,但是我依然有初始化自己的控制权。

依赖注入,谁要用(就是谁依赖),谁负责把别的类引入进来。

写简简单单的3个类,能解释Spring的思想。读取配置文件或者扫描Spring注解,利用反射实例化类,放置到一个Map中,这就是Spring IOC的基础过程了。

结合《Spring技术内幕:深入解析Spring架构与设计原理》,花费1个星期简要看看Spring源码,发现就是这样的。

单例三:状态和线程安全

参考文章:http://www.iteye.com/topic/960532

有状态:有状态就是有数据存储功能。

无状态:无状态的都是功能操作,对象是线程安全的。

几个概念:维护全局状态、控制状态读写、线程安全。

以上指的是状态的线程安全。对于HashMap的解释,如果从状态的线程安全绝度解释,也是说的通的,HashMap里面有数组,也是有状态的。

单例四:数据库

状态固化的单例:其实就是数据库,每一行就是一个单例。

跨JVM的单例:实现方式有很多,只要满足有锁的持久化即可。

多进程安全的单例:说的是数据库锁。

以上都是分布式的思想。

自从有了数据库,程序员就变得廉价了。

其他的创建模式

工厂、抽象工厂、建造者、原型。

工厂:创建对象很复杂,所以需要一个创建对象的工厂。

建造者:比如耐克工厂,有鞋帮,有鞋带,合起来之后是一个完整的整体,这就是建造者模式。

什么时候用单例,什么时候用单一状态(类的单一状态)。

为什么不全部用static,而用单例?有一种解释是:控制反转、依赖注入,这种思想。保留了初始化自己的控制权。如果完全的工具类,没有初始化的需求,static就满足了。

结构模式

开闭原则:对修改封闭,对扩展开放。

包装(Composite):不想改变原代码,又想实现某些功能。

代理(Proxy):举了一个监护人的例子,让吃才能吃。不改变语义,前前后后做点东西出来。

适配(Adapter):adapter比proxy更牛逼一些,它改变了语义,些许进行改造。

外观(Facade):和代理先比,结构相似,语义不同。

继承是标签,接口表现了具备什么能力。

面向对象一直争论的问题:

是用包含(用你的能力,但不打你的标签,"has a"),还是用继承("is a")。一种观点认为,继承对于软件设计,引入了复杂性。

行为模式

行为模式,描述的是对象的动作。局限性,必须顺序执行。???

模板:高层的流程抽象。

责任链:演示一个通过注解定义执行顺序的历程。好处:1.动态的组织流程;2. 代码控制流程的执行;深化一下,就是工作流。

以上两种模式,是重构的利器,加上反射,就可以写通用功能的中间件了。

不是结束

设计模式是很枯燥的,记住三件事:创建一个对象、包装一个对象、根据当前的场景,信手拈来。

农夫山泉:我们不生产水,我们只是大自然的搬运工。程序员不能成为农夫山泉,不能只是jar包的搬运工。要学会创造,一边搬砖的时候,一边想一想,如何创造出更优秀的东西。

大师的话(linus)

烂程序员关心的是代码。好程序员关心的是数据结构和它们之间的关系。

面向对象语言以对象为核心,加一些相关联的方法,简直是呓语。

重要的东西应该是数据结构,对象本身有啥重要?

真正有意思的,是在不同类型的不同对象交互而且有锁规则的时候。

但是,即使是这时候,封装什么“对象接口”也绝对错误,因为不再是单一对象的问题了。

他的结论是,面向对象解决的都是一些小问题。

这位大师是写操作系统的,从他的角度来看,自然是正确的,即使不从他的角度,我们也可以认识到数据结构的重要性。

http://www.csdn.net/article/1970-01-01/2824040

时间: 2024-08-05 11:18:48

Java与设计模式的相关文章

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

(转)Java经典设计模式(3):十一种行为型模式(附实例和详解)

原文出处: 小宝鸽 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之五大创建型模式(附实例和详解).Java经典设计模式之七大结构型模式(附实例和详解). 行为型模式细分为如下11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 接下来对11种行为型模式逐个进行介

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

Java Web 设计模式之开闭原则

1.开闭原则(OCP) 遵循开闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.也就是说,我们可以改变模块的功能. (2)对于修改是关闭的(Closed for modification).对模块行为进行扩展时,不必改动模块的源代码或者二进制代码.模块的二进制可执行版本,无论是可链接的库.DLL或者.EXE文件,都无需改动. 2.通过UML

Java软件设计模式------装饰设计模式

Java软件设计模式一共分为23种; 一般常用的有: 单例设计模式 装饰设计模式 工厂设计模式 装饰设计模式 定义:英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 在生活中我们用程序员和项目经理的例子来比喻,项目经理是从程序员开始的,经过不断地积累工作经验.不断的学习新的知识,才有可能升职. 在装饰设计模式中项目经理就是程序员的增强. 程序猿: 写程序 项目

(转)Java经典设计模式(2):七大结构型模式(附实例和详解)

原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式的核心思想,详情请看博主的另外一篇文章:Java经典设计模式之五大创建模式(附实例和详解). 接下来我们看看结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中适配器模式主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.其中的对象的适配器

java/android 设计模式学习笔记(12)---组合模式

这篇我们来介绍一下组合模式(Composite Pattern),它也称为部分整体模式(Part-Whole Pattern),结构型模式之一.组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别.这个最典型的例子就是数据结构中的树了,如果一个节点有子节点,那么它就是枝干节点,如果没有子节点,那么它就是叶子节点,那么怎么把枝干节点和叶子节点统一当作一种对象处理呢?这就需要用到组合模式了. 转