设计模式在项目中的应用
常用设计模式:
单例模式:
解决问题:配置类Config的对象只能有一个
解决方案:
Static Config instance
Private Config()
Static Config newInstance(){
If (instance==null){
Instance=new Config()
}
Return instance;
}
工厂模式:
解决问题:创建对象用new 耦合度高 new JdkDynamicAopProxy() 解决方案: 1,定义接口 AopProxy 2,有默认实现类JdkDynamicAopProxy
3,AopProxy AopProxyFactory.newInstance(){ Return new JdkDynamicAopProxy } 4,创建对象用 aopProxy=AopProxyFactory.newInstance() 以后增加新的实现类,改factory,创建对象的代码不用改。工厂用在框架中,增加新的实现类CgLib,只需要改框架,不影响使用框架的代码。框架增加功能了,用框架的代码不改。 实例源码: org.springframework.aop.framework.AopProxy org.springframework.aop.framework.DefaultAopProxyFactory
建造者模式:
解决问题:编程原则:单一职责原则,一个类只做一件事情,controller,service,mapper,vo,config,tools,execption, SqlSessionFactory在创建时要解析配置文件,做2件事 1,在构造方法中解析配置文件 2,创建sqlsession 解决方案:增加SqlSessionFactoryBuilder,解析配置文件 builder=new SqlsessionFactoryBuilder() sqlsessionFactory=builder.build() 程序员想要的方式new SqlsessionFactory()
适配器模式:
解决问题:接口的抽象方法很多 解决方案: Springmvc 接口handlerInterceptor有三个抽象方法, 增加HandlerInterceptorAdapter implements Handlerinterceptor{ 三个方法(){空实现} } 判断用户是否登录,extends Adapter只需要重写preHandle() org.springframework.web.servlet.HandlerInterceptor org.springframework.web.servlet.handler.HandlerInterceptorAdapter java.awt.event.MouseListener java.awt.event.MouseAdapter implements 接口,如果抽象方法很多,有3个或5个,框架很有可能写好了adapter. 应该extends adapter而不是implements 接口
装饰模式:
解决问题:一个类功能简单,满足不了我们的需求
解决方案:单一职责原则,
例子1:
Java.io.inputStream.read()
读出字符串 DataInputStream(inputstream)
读出对象 ObjectInputStream(inputstream)
例子2:
org.apache.ibatis.cache.Cache;chche的子类对PerpetualCache进行封装;
代理模式:
解决问题:controller,servlet有很多公用的代码,service,dao有公用的代码,希望公用的代码能自动执行。
解决方案:让代理去执行公用代码
观察者模式:
解决问题:上层界面层,下层数据层,数据层中的数据发生变化,上层应该知道,知道后显示最新数据,上层要观察下层。目标发生变化,观察者要知道。
解决方案:
回调callback,多态
责任链模式:
解决问题:filter,interceptor,plugin写多个,多个类都要执行 解决方案: 1, 接口handlerInterceptor 2, 多个实现类 3, HandlerExecutionChain HandlerInterceptor[] for(数组) 实例源码1: org.apache.ibatis.plugin.Interceptor org.apache.ibatis.plugin.InterceptorChain 实例源码2: org.springframework.web.servlet.HandlerInterceptor org.springframework.web.servlet.HandlerExecutionChain