设计模式学习(四) — 行为模式
行为模式主要侧重与类与类或对象与对象之间的交互过程
个人主页:tuzhenyu’s page
原文地址:设计模式学习(四) — 行为模式
(0) 基本概念
行为模式是类与类或者对象与对象之间交互方式的设计总结
行为模式主要包括责任链模式,观察者模式,状态模式
(1) 责任链模式
责任链模式主要是使多个对象有机会处理请求从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
责任链模式的优势:
有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;
可以动态添加责任链中的处理对象
责任链模式的缺点:
每一个请求都需要遍历职责链,性能上存在问题;
在处理对象中递归调用下一处理对象,如果递归层次过多会出现栈溢出;
责任链模式的使用场景
Spring MVC中的Filter过滤器,Interceptor拦截器使用责任链模式,请求传入后会先通过过滤器链的处理后再经Dispatcher分发到各个Controller处理器上;
Netty的Pipeline管道也是一种责任链模式,消息经过责任链中的Handler的处理后会传递到下一个Handler;
Spring中责任链使用实例
- 注册拦截器到容器中,当有请求到来后会依次经过拦截器责任链处理
@Component
public class ArticleClickInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
(2) 观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式的一个最重要的作用就是解耦。也就是将被观察者和观察者进行解耦,使得他们之间的依赖性更小,甚至做到毫无依赖。
观察者模式的使用情景:‘
Spring的的发布订阅模型是观察者模式的典型应用,通过定义ApplicationListener监听器对特定事件类型进行监听,通过ApplicationContextAware类的publishEvent()方法发布事件触发相应的监听器;
Zookeeper中的Watcher机制是观察者模式的典型应用,通过注册特定节点的观察器watcher,一旦节点发生变化都会触发执行watcher观察器的process()方法;
Spring中观察者模式的使用实例
- 继承ApplicationEvent类实现自定义事件类型
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
System.out.println("my Event");
}
public void print(){
System.out.println("hello spring event[MyEvent]");
}
}
- 继承ApplicationListener向容器中添加观察器Listener
@Component
public class MyListener implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof MyEvent){
System.out.println("into My Listener");
MyEvent myEvent=(MyEvent)event;
myEvent.print();
}
}
}
- 实现ApplicationContextAware接口实例化一个事件发布者EnentPublisher
@Component
public class MyPubisher implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
public void publishEvent(ApplicationEvent event){
System.out.println("into My Publisher's method");
applicationContext.publishEvent(event);
}
}
- 获取事件发布者实例,发布事件
public class MyTest {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("classpath:spring/application-database.xml");
MyPubisher myPubisher=(MyPubisher) context.getBean("myPublisher");
myPubisher.publishEvent(new MyEvent("1"));
}
}
总结
行为模式侧重于对象间的行为处理过程,主要包括责任链模式,观察者模式等,可以单独使用也可以组合使用;