设计模式的定义
模式就是某情景下(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设计原则:
封装变化、多用组合,少用继承、针对接口编程,不针对实现编程、为交互对象之间的松耦合而努力、类应该对扩展开放,对修改关闭、依赖抽象,不要依赖具体类、只和朋友交谈、别找我,我会找你、类应该只有一个改变的理由