您的位置:首页 > 编程语言 > Java开发

JDK中的设计模式理解

2014-11-14 15:18 204 查看
设计模式的定义

模式就是某情景下(context)下,针对某问题的某种解决方案。其中,情境就是应用某个模式的情况(应该是不断出现的情况);问题就是你想在某情景下达到的目标(也可以是某情景下的约束);解决方案就是你所追求的:一个通用的设计,用来解决约束、达到目标。

学习JDK中的设计模式,可以让我们借鉴优秀的代码设计,有助于提高代码的设计能力;JDK的设计体现了大多数的设计模式,是学习设计模式较好的方式;可以帮助我们更加深入地了解JDK。在了解设计模式之前,我们首先要知道类间的关系有继承,委托,依赖,聚合,组合的关系。

继承:面向对象的三大特性(封装、继承、多态)之一。从已有的类中派生出新的类,新的类吸收已有类的数据属性和行为,并能扩展新的能力。

委托:在委托模式中,有两个对象参与处理同一个请求,接收请求的对象将请求委托给另一个对象来处理。

依赖:类与类之间的连接。表示一个类依赖于另一个类的定义,描述了类与类之间一种使用与被使用的关系。

聚合:是一种has-a的关系,描述了整体与部分之间的关系。其中部分可以被共享,不随整体的消亡而消亡。

组合:是一种描述整体与部分之间更强的关系,部分不可以被其他实例共享,随整体的消亡而消亡。

下面就让我们一起了解JDK中的设计模式吧!

1、单例模式(Singleton)

作用:确保类只有一个实例,并提供一个全局访问点。

JDK中的体现:

1)Runtime :Runtime类封装了运行时的环境,每个java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。一般不能实例化一个Runtime对象,但可以通过getRuntime方法获得当前runtime运行时对象的引用。一旦得到了当前runtime对象的引用,就可以调用Runtime对象的方法去控制java虚拟机的状态和行为。

2)NumberFormat表示数字的格式化类,是所有数值格式的所有基类,该类提供了格式化和分析数值的接口。

2、静态工厂(Factory)

作用:代替构造函数创建对象,方法名比构造函数清晰。

JDK中的体现:

1)Integer.valueOf():构造一个Integer对象

2)Class.forName(String className):装载className这个指定的类,返回的是一个类,要求JVM查找并加载指定的类,JVM会执行该类的静态代码段。

3、工厂方法(Factory Method)

作用:按照需求返回一个实例的类型。

1)java.lang.Class#newInstance() :实例化一个对象

2)java.lang.Proxy#newInstance()

3) Collection.Iterator():实例化一个迭代器

4、抽象工厂方法(Abstract Factory)

作用:创建某一种类的对象

1)java.sql包:DriverManager.getConnection(),从已加载的数据库驱动中获得一个连接,我们创建一个基于某种数据库技术的连接。

5、生成器模式(Builder Pattern)

作用:定义了一个新的类来构造另一个类的实例,以简化复杂对象的创建

1)java.lang.StringBuilder#append

2) java.sql.PreparedStatement

6、原型模式(Prototype pattern)

作用:使得类的实例能够生成自身的拷贝。如果创建一个对象非常复杂且耗时,就可以使用这种模式,而不重新创建一个新的实例,你就可以拷贝一个对象,就在它的上面修改。

1)java.lang.Object#Clone:克隆

2) java.lang.clonable

7、适配器模式(Adapter pattern)

作用:把一个接口或者类变成另外一种

1)java.io.InputStreamReader(InputStream):将字节流转化成字符流

2)java.util.Arrays#asList():返回的是一个List(List是一个接口,返回List实际是返回List的一个实现)这个list在底层是用数组实现的(返回的是精确类型的List)

8、桥接模式(Bridge pattern)

作用:把抽象和实现解耦,于是接口与实现可以完全独立开来

1)AWT:提供了抽象层映射于实际的操作系统

2)JDBC

9、组合模式(Composite pattern)

作用:让使用者把单独的对象和组合对象混用

1)java.swing.component#add(Component)

2)java.awt.container#add(Container)

3)java.util.list#addAll(Collection)

4)java.util.set#addAll(Collection)

10、装饰器模式(Decorater pattern)

作用:为一个对象动态地加上一系列的动作,而不需要因为这些动作的不同产生大量的继承类。这个模式在JDK中无处不在

1)java.io.BufferedInputStream(InputStream)

2)java.util.Collections#checked(List|Map|Set|SortedMap|SortedSet)

11、外观模式(Facde pattern)

作用:用一个简单的接口包装一组组件、接口、抽象或子系统

1)java.lang.Class:无论一个类设计的如何复杂,如果只需要获取这个类的名称的话,getClassName()来进行获取

12、享元模式(Flyweight Pattern)

作用:有效率地存储大量的小对象

1)java.lang.Integer#ValueOf()

2) java.lang.Boolean#ValueOf()

13、代理模式(Proxy Pattern)

作用:用一个简单地对象代替复杂的对象,透明调用被代理对象,无须知道复杂的细节

1)java.lang.reflect.proxy:Proxy类用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类

Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler);

代理类是一个实现在创建类时在运行时指定的接口列表的类,并提供代理实例 proxy 和一个由其代理类 Foo 实现的接口

14、迭代器模式(Iterator Pattern)

作用:提供一种一致的方法遍历一个容器中所有的元素

1)java.util.iterator:迭代器

2)java.util.Enumeration:枚举

15、观察者模式(Observer pattern)

作用:允许一个对象向所有侦听自己的对象广播自己的消息或事件

1)java.util.eventListener

2) javax.servlet.http.HttpSessionBindingListener

16、协调者模式(Mediator)---中介者模式

作用:用来减少对象间的直接的通讯依赖关系,使用一个中间类来管理消息。

1)java.lang.reflect.Method#invoke(Object
obj,Object args[])使用参数args在obj上指派该对象所表示方法的结果

2)java.util.concurrent.Executor#execute()
使用线程池中的线程来执行任务

3)java.util.timer
是jdk中的定时调度类,主要用来定时触发任务

17、模板方法(Template
method)

作用:允许子类重载部分父类而不需要重写

1)java.util.Collections#sort()

2) java.io.inputStream#skip()

3) java.io.inputStream#read()

18、策略模式(Strategy pattern)

作用:定义一组算法,并将其封装到对象中,然后在运行时,可以灵活地使用其中一个算法

1)java.util.Comparator#compare()

19、责任链模式(Chain of Responsibility pattern)

作用:把一个对象在一个链接传递直到被处理。在这个链上的所有对象都有相同的接口(抽象类)但却有不同的实现

1)java.util.logging.Logger()#log() 会将log委托给parent.logger()

2)java的异常捕获机制,当方法运行出现异常时,首先将这个异常传入本方法的catch块,如果搞不了就传入调用这个方法的catch块,如果还搞不了就传入调用这个方法的方法的catch块以此类推

3)classLoader的委托模型

20、命令模式(Command pattern)

作用:把一个或一些命令封装到对象中

1)java.lang.runnable

2) javax.swing.Action

21、状态模式(State pattern)

作用:这个模式允许你在运行时很容易根据自身内部状态改变对象行为

1)java.util.Iterator 根据Iterator的不同状态会有不同输出

22、访问者模式(Visitor pattern)

作用:作用于某个对象群中各个对象的操作,它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作。

1)javax.lang.model.element.Element

2) javax.lang.model.element.ElementVisitor

23、解释器模式(Interpreter pattern)

作用:一个语法解释器的模式(用一组类代表某一规则)

1)java.util.pattern

2) java.text.format

24、备忘录模式(Memento pattern)

作用:给一个对象的状态作一个快照。Date类在内部使用了long型来做快照。

1)java.util.Date

2) java.io.Serializable

25、空对象(Null Object)

作用:解决一个Collection没有元素的情况

1)java.util.Collections#emptyList()

OO设计模式分类:

创建型(涉及到将对象实例化,将客户从所需要实例化的对象中解放出来)

Abstract Factory、signleton、factory method、builder、prototype

行为模型(只要是行为模型,都涉及到类和对象怎么交互及分配职责)

Observer、Strategy、State、Template method、command、iterator、chain
of responsibility、interpreter、mediato、memento、visitor


结构型(把类和对象组合到更大的结构中)

Composite、Decorator、Adapter、Proxy、Facade、Bridge、Flyweight

OO设计原则:

封装变化、多用组合,少用继承、针对接口编程,不针对实现编程、为交互对象之间的松耦合而努力、类应该对扩展开放,对修改关闭、依赖抽象,不要依赖具体类、只和朋友交谈、别找我,我会找你、类应该只有一个改变的理由
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: