访问者模式访问者模式是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改,接受这个操作的数据结构则可以保持不变访问者模式的定义封装一些用于某种数据结构中的各元素的操作,他可以在不改变数据结构的前提下定义这些元素的新操作。访问者模式的参与者:visitor抽象访问者:该角色声明一个或多个访问操作,定义访问者可以访问那些元素ConcreteVisitor具体访问者角色:该角色实现抽象访问角色中的各个操作Element抽象元素角色:该角色声明一个接受操作接受一个访问者对象ConcreteElement具体元素角色:该角色实现抽象元素中的接受操作ObjectStructure结构对象角色:
策略模式策略模式也称政策模式策略模式的定义定义一组算法,将每个算法都封装起来,并使它们之间可以互换。策略模式的参与者Context环境角色:该角色也叫上下文角色,起到承上启下的作用,他能够屏蔽高层模块对算法和策略的直接访问,封装可能存在的变化Strategy抽象策略角色:该角色定义了每个策略和算法必须具有的方法和属性ConcreteStrategy具体策略角色:该角色实现抽象策略中的具体操作策略模式简单示例抽象策略角色publicinterfaceStrategy{//定义每个策略和算法必须要有的方法和属性publicvoidcontextOfStrategy();}具体策略角色具体策略1pu
状态模式状态模式又称为状态对象模式,该模式允许一个对象在其内部状态改变时改变其行为状态模式的定义当一个对象内在状态改变时允许其改变行为,这个对象看起来改变了其类状态模式的参与者State抽象状态角色:该角色用以封装环境对像的一个特定状态所对应的行为ConcreteState具体状态角色:该角色实现环境的一个状态所对应的行为Context环境角色:该角色定义客户端需要的接口,并负责具体状态的切换。它会保留一个具体状态类的实例,该实例对象会给出环境对象的现有状态。状态模式的简单示例抽象状态角色publicabstractclassState{//封装环境对象protectedContextcont
备忘录模式备忘录模式,又称快照模式或Token模式。备忘录模式的定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可以将该对象恢复到以前保存的状态备忘录模式的参与者Originator发起人角色:该角色负责记录当前时刻的内部状态,负责定义那些属于备份范围的状态,负责创建和恢复备忘数据Memnto备忘录角色:该角色负责存储发起人角色的内部状态,在需要时提供发起人所需要的的内部状态。Caretaker备忘录管理员角色:该角色对备忘录角色进行管理、保存和提供备忘录。备忘录模式的简单示例发起人角色publicclassOriginator{//内部状态变量pr
中介者模式中介者模式也称调停模式中介者模式的定义:用一个中介对象封装一系列对象(同事)的交互,中介者使各个对象不需要显式的的相互作用,从而使其耦合松散,而且可以独立地改变他们之间的交互。中介者模式的参与者Mediator抽象中介者:该角色定义出同事对象到中介者对象的统一接口,用于各个同事角色之间的通信ConcreteMediator具体中介者:该角色实现抽象中介者,它依赖于各个同事角色Colleague抽象同事角色:该角色定义中介者到同事对象的接口,同事对对象只知道中介者而不知道其余同事的对象ConcreteColleague具体同事角色:该角色实现抽象同事类,每一个具体同事类都清楚自己在小范
观察者模式观察者模式,也称发布订阅模式观察者模式的定义定义对象中一种一对多的依赖关系,使得当一个对象改变时,则所有依赖于他的对象都会得到通知并被自动更新观察者模式的参与角色Subject被观察者(主题角色):被观察者需要能够动态的增加和取消观察者,它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者Observer观察者:观察者受到被观察者的通知后,会执行更新操作,对更新的信息进行处理ConcreteSubject具体被观察者(具体主题):定义观察者自己的业务逻辑,同时定义通知事件ConcreteObserver具体观察者:在观察者接受到消息后,各个观察者有自
迭代器模式迭代器模式的定义:迭代器模式提供一种访问容器对象中各个元素又不暴露该对象的内部细节迭代器是为容器服务的。容器就是能容纳对象的对象。如果把水看做对象,那么水缸就是容器。迭代器模式的参与角色Iterator抽象迭代器:该角色负责定义访问和遍历元素的接口ConcreteIterator具体迭代器:该角色实现Iterator接口,完成容器元素的遍历Aggregate抽象容器:该角色提供创建迭代器角色的接口ConcreteAggregate具体容器:该角色实现抽象角色接口,创建出容纳迭代器的对象迭代器模式的简单示例抽象迭代器角色publicinterfaceIterator{publicObj
解释器模式解释器模式是一种按照规定语法进行解析的方案。解释器模式的定义:给定一门语言,定义它的文法的一种表示并定义一个解释器,该解释器用来表示解释语言中的句子。解释器模式的参与者:AbstractExpression抽象解释器角色:该角色声明一个所有具体表达式角色所需要的的接口TerminalExpression终结符表达式:该角色实现了抽象表达式所需要的接口Nonterminal非终结符表达式:该角色是一个具体角色,Context环境角色:Context角色提供一些解释器之外的全局信息解释器模式的简单示例抽象解释器模式publicinterfaceIArithmeticInterpreter
命令模式命令模式,又可以称为行动模式或交易模式命令模式的定义:将一个请求封装成为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式的参与者:Command命令角色:该角色声明一个给所有具体命令类的接口,定义需要执行的命令ConcreteCommand具体命令角色:该角色定义一个接收者和行为之间的弱耦合,实现命令方法,并调用接收者的相关操作Receiver接收者角色:该角色负责具体实施和执行一个请求Invoker调用者角色:该角色调用命令对象执行请求那么看到这边,很多人依旧是一脸懵逼!该如何理解命令模式呢。一个命令的执行有可能需要多
责任链模式责任链模式的定义:使多个对象都有机会处理请求,从而避免了请求发送者和请求接受者之间的耦合关系,将这些对象连城一条链,并沿着这条链传递请求,直到有对象处理它为止。责任链模式涉及的角色:Handler抽象处理者:该角色对请求进行抽象,并定义一个方法以设定和返回对下一个处理者的引用ConcreteHandler具体处理者:该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者责任链模式的简单示例抽象处理者抽象处理者一般采用抽象类,抽象类中有指向下一个抽象处理者的指针,并且定义在何种情况下会将请求转交到下一处理者,并且定义了请求处理的接口publicabstractclassHa
享元模式享元模式的定义:使用共享对象可以有效的支持大量的明细粒度的对象享元模式是以共享的方式高效的支持大量的细粒度的对象,而享元模式能做到共享的关键是区分内部状态和外部状态。内部状态:内部状态是存储在享元对象内部的,可以共享的信息,并且这些信息不会随着环境的改变而改变外部状态:外部状态是对象得以依赖的标记,外部状态是随环境改变而改变且不可以共享的状态享元模式的参与角色Flyweight抽象享元角色:该角色对享元类进行抽象,同时定义对象的外部状态和内部状态的接口或实现ConcreteFlyweight具体享元角色:该角色实现抽象享元定义定义业务,同时享元对象的内部状态必须与环境无关,从而使得享元
外观模式(门面模式)外观模式的定义:要求一个子系统的外部预期内部的通信必须通过一个统一的对象进行,外观模式提供了一个高层次的接口,使得子系统更容易使用外观模式的参与者:Client客户端:Facade子系统接口:客户端可以调用该角色的方法,该角色知晓相关模块的子功能和责任。该门面是客户端调用子系统的桥梁。Subsystem子系统中定义的类:子系统是具体业务的实现,但是子系统并不需要被调用的是谁外观模式的简单示例SubsystemSubClassApublicclassSubClassA{publicvoidexecuteProcedureA(){System.out.println("
组合模式组合模式又称合成模式,用来描述部分与整体之间的关系组合模式的定义:将对象组合成树形结构以表示“部分-整体”的层次机构,使得用户对单个对象和组合对象的使用具有一致性。组合模式IDE三个角色:Component抽象构件角色:该角色定义了参加组合对象共有的方法和属性。Leaf叶子构件角色:该角色是叶子对象,其下没有其他分支。Composite树枝构建角色:组合树枝节点和叶子节点形成的一个树形结构。组合模式的简单示例抽象构件角色该对象既可以是接口,也可以是抽象类abstractclassComponent{privateStringname;privateStringcontent;publi
桥接模式桥接模式的定义:将抽象和实现解耦,是两者可以独立的变化桥接模式的参与者:Abstraction抽象化角色:该角色抽象化的给出定义,并保存一个对实现化对象的引用。RefinedAbstaraction修正抽象化角色:该角色扩展抽象化角色,它引用实现化角色并对抽象化角色进行修正。Implementor实现化角色:该角色给出实现化角色的接口,但不给出具体的实现ConcreteImplementor具体实现化角色:该角色对实现化角色接口中的方法进行具体的实现桥接模式的简单示例实现化角色publicinterfaceImplementor{publicvoidexecuteA();publicv
装饰器模式装饰器模式的定义:动态的给一个对象添加额外的职责,就功能来说,装饰模式相比子类更为灵活装饰器模式的四个角色:Componment抽象构建角色:该角色用于规范需要装饰的对象ConcreateComponment具体构建角色:该角色是需要被装饰地对象Decorator:装饰角色:一般是一个抽象类,该角色持有私有的一个抽象构件对象ConcreateDecorator:具体装饰角色;感觉主要负责对构件对象进行装饰装饰器模式的简单示例抽象构件角色publicinterfaceComponment{publicvoiddoingProcedureA();}具体构件角色publicclassCon
代理模式代理模式的定义:代理模式为其他对象提供一种代理以控制这个对象的访问、代理模式的三个主要角色:Subject抽象主题角色:抽象主题类的主要职责是声明真实主题与代理的共同接口方法,该类可以是接口也可以是抽象类ProxySubject代理主题角色:该角色主要负责引用和控制真实主题,负责在需要的时候创建或删除真实主题对象RealSubject真实主题角色:该类是代理标识的真实对象,是业务逻辑的具体执行者代理模式的种类1.远程代理远程代理就是将工作委托给远程对象(不同的进程,不同的机械)来完成。2.虚拟代理当创建一个资源耗费比较多的资源时,可以首先创建代理对象,而将真实的的对象延时创建。3.保护
适配器模式适配器模式的定义:将一个类的接口变换成为客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类可以在一起工作。采用适配模式的目的是将先有的旧接口转换成新的刻画短接口,我们的目标是尽可能多地重用原来已经测试过的代码,并且可以对新接口自由地进行修改。适配器的三个角色:Target目标角色:该角色定义要转换成的目标接口Adaptee源角色:需要被转换的就的接口Adapter适配器角色:通过继承Target适配器的简单示例Target角色publicinterfaceTarget{publicvoiddoNewFunction();}Adaptee角色publicclass
对象池模式对象的示例化是最耗费性能的操作之一,这在过去是一个大问题,现在我们不用再过于关注它。当我们处理封装外部资源时,对象的创建操作则会耗费很多资源。解决方案是重用和共享这些创建成本高昂的对象,这称为对象池模式对象池模式的参与者:ResourcePool(资源池类):用于封装逻辑的类,用来保存和管理资源列表Resource(资源类):用于封装特定资源的类。资源类通常被池资源引用,因此只要资源池不重新分配,他们就永远不会回收。Client(客户端类):使用资源的类对象池模式的简单示例资源池publicclassResourcePool{privateList<Resource>re
原型模式原型模式的定义:用原型实例创建对象的种类,并且通过复制这些原型创建新的对象原型模式涉及的三个角色:Client角色(客户角色):该角色提出创建对象的请求Prototype角色(抽象原型角色):该角色用于给出具体原型所需的接口,常由接口或抽象类担任ConcreteProtype角色(具体角色):该角色是被复制的对象必须实现抽象原型的接口浅拷贝与深拷贝当拷贝对象时,拷贝的对象只包含简单的数据类型,或不可变对象时,就直接将这些字段复制到新对象中但是如果拷贝对象中包含引用对象时,只拷贝引用对象的地址而不拷贝整个被引用的对象被称为浅拷贝,如果新开辟一块内存区域,将整个引用对象都拷贝一份,我们称之
建造者模式建造者模式的定义:讲一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。建造这的四个参与对象Product对象:表示要被构造的复杂对象。该对象往往是通过模板模式进行实现的。Builder对象:是具体构造对象ConcreteBuilder的指定接口。ConcreteBuilder对象:实现Builder对象的接口以及构造和装配该产品的各个产品。Director对象:负责调用Builder接口,并用该接口构造对象。首先,我们可以从中建造者模式的简单示例Builder对象publicinterfaceBuilder{publicProductcreateProduct(
工厂方法模式工厂模式用于实现逻辑的封装,并通过公共的忌口提供对象的实例化服务,在添加新类时只需要做少量的修改。1.静态工厂模式(简单工厂模式)静态工厂属于创建者模式,静态工厂模式的实现需要三个角色简单工厂:负责创建具体产品产品,工厂类的方法可以被外界直接调用抽象产品:在Java中,抽象产品是由抽象类或者接口担任的,用以让具体产品继承或实现具体产品:在Java中,具体产品是工厂类创建的主要对象。静态工厂的通用写法工厂角色publicclassCandyFactory{publicenumCandyKind{FRUITCANDY("fruitCandy"),COLACANDY(
模板方法模式什么是模板方法模式?模板方法模式的定义:定义一个操作算法的框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法结构,即可重新定义该算法的某些特定步骤。模板方法的参与者:模板方法:一个模板方法至少对应一个或多个基本犯法,通过模板方法可以完成对基本方法的调用基本方法:继承或实现了模板方法,并可以被模板方法对象调用。通过以上的定义,可能还是云里雾里的。依旧不明所以。那么通过一个简单的示例便会恍然大悟模板方法示例模板方法publicinterfaceCandy{publicvoidtasteCandy();publicStringgetFlavor();}基本方法OrangeCandy
Java设计模式的相关原则一、单一职责原则单一职责原则:应该有且仅有一个原则引起类的变更单一职责可以简答的理解为,一个类或者对象,承担的只能应该尽可能单一。单一职责的优点:降低类的复杂性提高代码的可读性可维护性提高变更引起的风险降低如何理解单一职责原则:例如有一个类里面包含了属性以及属性的get与set方法和一些操作这个类的诸多属性而完成的相关业务逻辑。此时我们可以将这个类分为两个对象,一个用于管理对象的属性,另一个用于管理对象的业务逻辑。单一职责用“职责”和“变化原因”来衡量接口或类设计得是否优良。但是“职责”的确定往往是无法度量的。单一职责并不是处处受用的,在现实过程中,如果将职责拆分的过
单例设计模式单例模式的特点某个类只能有一个实例它必须自行创建这个类它不许向整个系统提供这个类的实例饿汉模式/立即加载饿汉式的特点:在使用类时就已经将对象加载完毕饿汉式的缺点:由于在使用前就加载完毕,会造成内存资源的浪费在获取实例时,若没有同步方法,容易产生非线程安全问题。饿汉式的创建方式:静态常量饿汉式静态代码块饿汉式枚举类静态常量饿汉式//静态常量的饿汉式publicclassSingleton1{privatestaticSingleton1instance=newSingleton1();privateSingleton1(){}publicstaticSingleton1getInst