java设计模式
1.java模式之策略模式
分别封装行为接口,实现算法族,超类里放行为接口对象,子类里具体设定行为对象。
原则就是:分离变化部分,封装接口,基于接口编程各种功能。
此模式让行为算法的变化独立于算法的使用者。
2.java模式之观察者模式
对象之间多对一依赖的一种设计方案,被依赖的对象为subject,依赖的对象为observer,subject通知observer变化。
java有内置的观察者:observerable实现类和observer接口。在调用内置的update()方法之前,注意要调用setChange()方法。
3.java模式之装饰者模式
动态的将新功能附加到对象上。在对象扩展方面,它比继承更有弹性。
开放--关闭原则。对新功能的开发,对旧有的已经开发的功能关闭,不允许修改。
核心:递归方法的运用。
4.java模式之单利模式
确保一个类最多只有一个实例,并提供一个全局访问点。
优化:同步(synchronized)getInstance()方法。“急切”创建实例(饿汉式)。双重检查加锁。
5.java模式之工厂模式
核心:把对象的实例化部分抽取出来,单独进行创建和处理。
依赖抽象原则:1.变量不要持有具体类的引用;2.不要让类继承自具体类,要继承自抽象类或接口;3.不要覆盖基类中已实现的方法。
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为。
工厂方法模式:定义一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
抽象工厂模式:定义了一个接口,用于创建相关或有依赖关系的对象族,而无需明确指定具体类。
6.java模式之命令模式
将请求、命令、动作等封装成对象,这样可以让项目使用这些对象来参数化其他对象。使得命令的请求者和执行者解耦。
7.java模式之适配器模式
将一个类的接口转换成另一种接口。让原本接口不兼容的类可以兼容。
类适配器:通过多重继承目标接口的方式和适配者类来实现适配。
多重继承,其中继承的目标接口部分达到适配目的,而继承被适配者类的部分达到通过调用被适配者类里的方法来实现目标接口的功能。
8.java模式之外观模式
提供一个统一的接口,来访问子系统中一群功能相关的接口。
外观模式定义了一个高层接口,让子系统更容易使用。
9.java模式之模板模式
封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现。
模板模式可以在不改变算法结构的情况下,重新定义算法中的某些步骤
10.java模式之迭代器模式
提供一种方法顺序访问一个聚合对象中的各个对象
11.java模式之组合模式
将对象聚合成树形结构来表现“整体/部分”的层次结构
组合模式能让客户以一致的方式来处理个别对象以及对象组合
也就是我们可以忽略对象组合与个体对象之间的差别
12.java模式之状态模式
根据内部状态的变化,改变对象的行为,看起来好像修改了类
13.java模式之代理模式
代理模式的原理:为一个对象提供一个替身,以控制这个对象的访问。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。代理模式有很多种变体,都是为了控制与管理对象的访问。
远程代理:远程对象的本地代表,通过它可以让远程对象当做本地对象来调用。远程代理通过网络和真正的远程对象沟通信息。
java RMI:RMI远程方法调用是计算机之间通过网络实现对象调用的一种通讯机制。使用这种机制,一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。 在过去,TCP/IP通讯是远程通讯的主要手段,是面向过程的开发。 而RPC使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持。 RMI被设计成一种面向对象开发方式,允许程序员使用远程对象来实现通讯。
RMI的使用,分为四步:(本地:RMI STUB 服务器:RMI SKELET)
1、制作远程接口:接口文件
2、远程接口的实现:Service文件
3、RMI服务端注册,开启服务
4、RMI代理端通过RMI查询到服务端,建立联系,通过接口调用远程方法
几种常见的代理:虚拟代理、动态代理、保护代理、几种变体(防火墙代理-局域网、缓存代理-本地缓存、智能引用代理—代理过程中增加部分功能、同步代理-多线程中使用、写入时复制代理-写入时才真正执行操作)
虚拟代理:为创建开销大的对象提供代理服务。真正的对象在创建前和创建中时,由虚拟代理来扮演替身。如Android的在线图片加载类。
动态代理:运行时动态的创建代理类对象,并将方法调用转发到指定类。核心组成包含Proxy对象(代理)以及InvocationHandler对象(控制)。
保护代理:简单可以理解为动态代理中的控制。控制就是为了保护。
14.java模式之桥接模式
java模式之桥接模式
将实现与抽象放在 两个不同的类层次中,使两个层次可以独立改变。
桥接模式与策略模式差异
1.桥接的目的是让接口实现与抽象层可以分别演化,从而提高移植性
策略的目的是将复杂的算法封装起来,从而便于替换不同的算法
2.桥接模式是为了利用已有的方法或类
策略模式是为了扩展和修改,并提供动态配置
3.桥接模式强调接口对象仅提供基本操作
策略模式强调接口对象提供的是一种算法
15.java模式之生成器模式
生成器模式:封装一个复杂对象构造过程,并允许按步骤构造。
优点:
将复杂对象的创建过程封装起来。
允许对象通过几个步骤来创建,并且可以改变过程(工厂模式只有一个步骤)
只需指定具体生成器就能生成特定对象,隐藏类的内部结构
对象的实现可以被替换
生成器模式和抽象工厂模式在功能上很相似,主要区别:
生成器一般用来创建大的复杂的对象
生成器模式强调的是一步步创建对象,可以改变步骤来生成不同的对象
一般来说生成器模式中对象不直接返回
16.java模式之责任链模式
责任链模式:如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。
优点:
将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。
可以简化对象,因为它无须知道链的结构。
可以动态地增加或删减处理请求的链结构
缺点:
请求从链的开头进行遍历,对性能有一定的损耗
并不保证请求一定被处理
责任链模式和状态模式的主要区别:
责任链模式注重请求的传递
状态模式注重对象状态的转换
17.java模式之蝇量模式
蝇量模式:通过共享的方式高效地支持大量细粒度的对象。
优点:
减少运行时的对象实例个数,节省创建开销和内存
将许多“虚拟”对象的状态集中管理。
缺点:
系统设计更加复杂
需要专门维护对象的外部状态
18.java模式之解释器模式
解释器模式:定义一个语法,定义一个解释器,该解释器处理该语法句子。
将某些复杂问题,表达为某种语法规则,然后构建解释器来处理这类句子。
优点:
容易修改,修改语法规则只要修改相应非终结符即可
扩展方便,扩展语法只要增加非终结符类即可
缺点:
对于复杂语法的表示会产生复杂的类层次结构,不便管理和维护
解释器采用递归方式,效率会受影响
注意事项:
尽量不要在重要的模块中使用解释器模式
解释器模式在实际的系统开发中使用的非常少
可以考虑一下Expression4J、MESP、Jep等开源的解析工具包
19.java模式之中介者模式
中介者模式:用一个中介对象来封装一系列的对象交互。
中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
优点:
通过将对象彼此解耦,可以增加对象的复用性
通过将控制逻辑集中,可以简化系统维护
可以让对象之间所传递的消息变得简单而且大幅减少
提高系统的灵活性,使得系统易于扩展和维护
缺点:
中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
如果设计不当,中介者对象本身变得过于复杂
20.java模式之备忘录模式
备忘录模式:在不破坏封装的前提下,存储关键对象的重要状态,从而可以在将来把对象还原到存储的那个状态。
优点:
状态存储在外面,不和关键对象混在一起,这可以帮助维护内聚
提供了容易实现的恢复能力
保持了关键对象的数据封装
缺点:
资源消耗上面,备忘录对象会很昂贵
存储和恢复状态的过程比较耗时
21.java模式之原型模式
原型模式:通过复制现有实例来创建新的实例,无须知道相应类的信息。
优点:
使用原型模式创建对象比直接new一个对象更有效
隐藏制造新实例的复杂性
重复地创建相似对象时可以考虑使用原型模式
缺点:
每一个类必须配备一个克隆方法
深层复制比较复杂
注意事项:
使用原型模式复制对象不会调用类的构造方法。所以,单例模式与原型模式是冲突的,在使用时要特别注意。
使用原型模式的时候,类中不能有final对象。
object类的clone方法只会拷贝对象中的基本数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。
22.java模式之访问者模式
访问者模式:对于一组对象,在不改变数据结构的前提下,增加作用于这些结构元素新的功能。
适用于数据结构相对稳定,它把数据结构和作用于其上的操作解耦,使得操作集合可以相对自由地演化。
优点:
符合单一职责原则
扩展性良好
有益于系统的管理和维护
缺点:
增加新的元素类变得很困难
破坏封装性
23.java模式之复合模式
复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。