23种设计模式
1.1设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式 等。本文我们先介绍第一种模式——工厂模式!
1.责任链模式
先介绍下责任链模式,责任链模式是对象的一种行为模式,在责任链里 很多对象 由一个对象对其他下家的引用而连接一起形成一条链
请求在这个链上传递,知道某个对象决定处理此请求,发出请求的客户端并不知道链上的哪一个对象最终处理了此请求,
这使得系统可以在不影响客户端的情况下动态的重新组织和分配责任。
当如任务分配到到责任链上时候,就会出现这样的优势局面
责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
类与类之间可以以松耦合的形式加以组织。
当然也出了不利的局面:在处理多任务是以链的模式实现对象的传递,不同的实现方式会影响处理响应的速度。
如下案例:
我们基于JAVA语言的实现的简单的责任链。
场景: 设计模拟商场打折,导购员只能 提供 100元以内的优惠 经理提供500元以内的优惠。
package com.yaic.utils;
/**
* 目标: 1. 设计一个抽象处理类 AbstractHandlerChain
要求:第一. 持有当前对象的引用
第二.提供当前对象的获取
第三.共同的业务处理方法
第四.下一个对象传递
* @author 宋淑华
*
*/
public abstract class AbstractHandlerChain {
protected AbstractHandlerChain seccessor;
public AbstractHandlerChain getHandlerChain() {
return this.seccessor;
}
/**
* 具体的业务实现方法(需根据自己的业务处理,设计 入参和返回参数校验)
* @param discount
*/
public abstract void handChain(double discount);
/**
* 设置一下处理对象
*/
public void setHandlerChain(AbstractHandlerChain chain) {
this.seccessor = chain;
}
}
设计两个业务处理对象 导购员(HandlerChainSales)
经 理() 都继承处理责任链
package com.yaic.utils;
/**
* 设计两个业务处理对象 导购员(HandlerChainSales)
经 理() 都继承处理责任链。
导购员
1.最高只能优惠100
2.再高的话只能请示经理
* @author 宋淑华
*
*/
public class HandlerChainSales extends AbstractHandlerChain{
@Override
public void handChain(double discount) {
if(discount<100) {
System.out.println("可以成交" +discount );
}else {
//请示经理
setHandlerChain(HandlerChainStaticFactory.createHandlerChainManager());
seccessor.handChain(discount);
}
}
}
经理设计
package com.yaic.utils;
/**
* 经理
* 只能优惠500 再优惠我们就不卖了 不做亏本的买卖
* @author 宋淑华
*
*/
public class HandlerChainManager extends AbstractHandlerChain{
@Override
public void handChain(double discount) {
if(discount<500) {
System.out.println("卖了 卖了"+discount);
}else {
System.out.println("瞅啥,不卖了"+discount);
}
}
}
对象创建工厂
package com.yaic.utils;
public class HandlerChainStaticFactory {
/**
* 导购员
*
*/
public static HandlerChainSales createHandlerChainSales(){
return new HandlerChainSales();
}
/**
* 经理
*
*/
public static HandlerChainManager createHandlerChainManager(){
return new HandlerChainManager();
}
}
package com.yaic.utils;
/**
* 测试
* @author 宋淑华
*
*/
public class App {
public static void main(String[] args) {
AbstractHandlerChain abstractHandlerChain = new HandlerChainSales();
abstractHandlerChain.handChain(10);
abstractHandlerChain.handChain(200);
abstractHandlerChain.handChain(1000);
}
}
结果
简单的结果示意图:
责任链模式,实际的运行场景非常的广泛,如 filter 拦截 ,servlet,Servlet Engine启动,tomcat服务器, springmvc spring 等 框架中都有应用。