【策略模式】类型:行为模式。定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
例:Tomcat中Catalina类,用Digester来解析配置文件server.xml。EngineRuleSet继承了RuleBase类,重写addRuleInstance()方法,用来解析Engine节点。HostRuleSet解析Host节点。Digester.addRuleSet(RuleSet ruleset)将EngineRuleSet、HostRuleSet对象当参数传入,然后调用的他们的addRuleInstance方法执行各自的处理逻辑。Digester根本就不知道RuleBase怎么处理规则,没有算法。算法的实现依赖RuleBase子类的实现,所以要将RuleBase对象传入Digester。
【外观模式】 类型:结构模式。为子系统中的一组接口提供一个一致的interface接口界面。
Facade可持有多个SubSystem Classes对象,并封装各对象需要对外提供访问的方法,统一接口。
例:Tomcat中Servlet类内置对象ServletConfig的实现类是StandardWrapperFacade,他是对StandardWrapper的封装,只提供了几个方法供Servlet访问,防止业务类中直接操作框架系统的数据。
【模板方法模式】类型:行为模式。模板方法模式定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
将相同的功能抽象出来成一个父类,然后用子类做不同功能的实现。算法结构是固定的,这和策略模式不同。
例:Tomcat源码中Servlet类的实现,业务类只要继承HttpServlet类,重写service()相关方法,实现自己的业务即可。
【观察者模式解释】 类型:行为模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象的状态发生改变时,会通知所有的观察者对象,使它们能够自己更新自己。
例:Tomcat中StandardContext类,其父类ContainerBase,有属性lifecycle(LifecycleSupport对象)。StandardContext.init()方法中,this.addLifecycleListener(config),将ContextConfig对象添加到lifecycle的listenes(LifecycleListener)数组中。lifecycle.fireLifecycleEvent(INIT_EVENT,null);循环遍历listeners调用相关方法。
【责任链模式】使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
例:Tomcat中请求的处理用StandardPipeline、Valve。FilterChain处理各过滤器。
【组合模式】将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。
用于处理树形结构,枝节点持有子节点的数据结构(List、Map)。
例:Tomcat中StandardEngine、StandardHost、StandardContext、StandardWrapper都继承了ContainerBase。前三个是枝节点,在init和start方法中,都会遍历执行子节点集合的相关方法。StandardWrapper是Leaf节点。
【享元模式】使用共享对象可有效地支持大量的细粒度对象。
将基本固定的信息放置池(Map)中,不用每次都new一个,节省内存。如果池中没有该对象(UnsharedConcreateFlyweight)则加到池中,有对象则直接取出。包含工厂模式。
例:Tomcat源码中,JIoEndpoint类用内部类Worker控制请求数量的,空闲的Worker对象放置在WorkerStack中,等待请求。如果WorkerStack中没有空闲的Worker,而忙碌的Worker数量又没有达到上限,则创建新的Worker;如果达到上限的话只能一直等待,直到有Worker被释放。
以上七种模式Tomcat中有使用,其他模式的使用待发现。。。
【装饰模式】类型:结构模式。动态的对一个对象进行功能上的扩展,也可以对其子类进行功能上的扩展。
装饰者与被装饰者继承相同接口,前者持有后者的对象。装饰者的方法调用被装饰的方法。
【代理模式】类型:结构模式。对一些对象提供代理,以限制那些对象去访问其它对象。
装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
【原型模式】类型:创建模式。用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。
简单点说就是类的复制:clone()。
【命令模式】将一个请求封装为一个对象,从而使你不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
具体命令类ConcreteCommand实现Command接口,请求者(Invoker)持有命令对象,命令对象持有接收者(Receiver)。客户端(Client)创建请求者、命令、接收者,设置关系后,执行请求者的方法。
【适配器模式】分对象适配器和类适配器两种形式。对象适配器与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用依赖关系连接到Adaptee类。
用于系统维护的补救。
【桥接模式】将抽象部分与它的实现部分分离,使他们可以独立地变化。别名为:Handle/Body。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
【中介者模式】用一个中介者对象来封装一系列的对象交互。
对象间互相持有引用,成蜘蛛网结构。考虑使用此模式,将其改成星型结构。
例:MVC的action配置文件,消息系统。
【备忘录模式】在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
Caretaker备忘录管理员,管理Memento(备忘录),Client只要知道Caretaker和Originator(发起人)即可实现备份。无需关系具体的备忘录(Memento)细节。
【访问者模式】表示一个作用于某对象结构中各元素的操作。它可以使你不修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法。
具体元素ConcreteElement的accept方法以访问者visitor为参数,调用visitor.visit(this),将具体元素对象传给访问者,让访问者处理。
【状态模式】把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
状态决定行为。Context(环境对象)的Request方法会执行属性对象status的handle()方法。
【单例模式】