JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(5):责任链模式、观察者模式
一、责任链模式、观察者模式
1、责任链模式:当一个对象在一条链上被多个拦截器处理(烂机器也可以选择不拦截处理它)时,我们把这样的设计模式称为责任链模式,它用于一个对象在多个角色中传递的场景。
2、观察者模式:观察者模式又称为发布电话与模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监视着被观察者的状态,当被观察者的状态变化时,会通知观察者,并让其自动更新自己。
二、责任链模式(例子)
创建测试接口:HelloWorld.java
package com.xfwl.proxy.jdk;
public interface HelloWorld {
public void sayHelloWorld();
}
创建测试接口的实现子类:HelloWorldImpl.java
package com.xfwl.proxy.jdk;
public class HelloWorldImpl implements HelloWorld {
public void sayHelloWorld() {
System.out.println("Hello World!");
}
}
创建代理类:JdkProxyExample.java
package com.xfwl.proxy.jdk; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* JDK的动态代理
* @function 两个步骤:(1)建立代理对象和真实服务对象的关系。(2)实现代理逻辑。
* @author 小风微凉
* @time 2018-7-9 上午10:45:53
*/
public class JdkProxyExample implements InvocationHandler {
//真实对象
private Object target=null;
/**
* 建立代理对象和真实对象之间的代理关系,并返回代理对象
* @param target 真实对象
* @return 代理对象
*/
public Object bind(Object target){
this.target=target;
return Proxy.newProxyInstance(
target.getClass().getClassLoader(), //类加载器
target.getClass().getInterfaces(), //动态代理所挂的接口
this //实现方法逻辑的代理类,必须实现InvocationHandler接口的invoke方法
);
}
/**
* 代理方法逻辑
* @param proxy 代理对象
* @param method 当前调度方法
* @param args 当前方法参数
* @return 代理结果返回
* @throws Throwable 异常
*/
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
System.out.println("进入代理方法");
System.out.println("在调度真实方法之前的服务");
Object obj=method.invoke(this.target, args);//相当于调用sayHelloWorld方法
System.out.println("在调度真实方法之后的服务");
return obj;
}
}
创建责任链拦截器-1
package com.xfwl.designmodels.responseChain; import java.lang.reflect.Method; import com.xfwl.interceptor.Interceptor;
/**
* 拦截逻辑1
* @function
* @author 小风微凉
* @time 2018-7-9 下午4:03:37
*/
public class Interceptor1 implements Interceptor { @Override
public boolean before(Object proxy, Object target, Method method,
Object[] args) {
System.out.println("【拦截器1】的before方法");
return true;
} @Override
public void around(Object proxy, Object target, Method method, Object[] args) {
// TODO Auto-generated method stub } @Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("【拦截器1】的after方法");
}
}
创建责任链拦截器-2
package com.xfwl.designmodels.responseChain; import java.lang.reflect.Method; import com.xfwl.interceptor.Interceptor;
/**
* 拦截逻辑2
* @function
* @author 小风微凉
* @time 2018-7-9 下午4:03:37
*/
public class Interceptor2 implements Interceptor { @Override
public boolean before(Object proxy, Object target, Method method,
Object[] args) {
System.out.println("【拦截器2】的before方法");
return true;
} @Override
public void around(Object proxy, Object target, Method method, Object[] args) {
// TODO Auto-generated method stub } @Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("【拦截器2】的after方法");
}
}
创建责任链拦截器-3
package com.xfwl.designmodels.responseChain; import java.lang.reflect.Method; import com.xfwl.interceptor.Interceptor;
/**
* 拦截逻辑3
* @function
* @author 小风微凉
* @time 2018-7-9 下午4:03:37
*/
public class Interceptor3 implements Interceptor { @Override
public boolean before(Object proxy, Object target, Method method,
Object[] args) {
System.out.println("【拦截器3】的before方法");
return true;
} @Override
public void around(Object proxy, Object target, Method method, Object[] args) {
// TODO Auto-generated method stub } @Override
public void after(Object proxy, Object target, Method method, Object[] args) {
System.out.println("【拦截器3】的after方法");
}
}
创建测试类:TestChain.java
package com.xfwl.designmodels.responseChain; import com.xfwl.interceptor.InterceptorJdkProxy;
import com.xfwl.proxy.jdk.HelloWorld;
import com.xfwl.proxy.jdk.HelloWorldImpl; /**
* 测试责任链模式
* @function
* @author 小风微凉
* @time 2018-7-9 下午4:05:43
*/
public class TestChain {
/**
* @param args
*/
public static void main(String[] args) { //拿到代理对象1,并绑定真实对象
HelloWorld proxy1=(HelloWorld) new InterceptorJdkProxy().bind(
new HelloWorldImpl(),
"com.xfwl.designmodels.responseChain.Interceptor1"
);
//拿到代理对象2,并绑定真实对象
HelloWorld proxy2=(HelloWorld) new InterceptorJdkProxy().bind(
proxy1,
"com.xfwl.designmodels.responseChain.Interceptor2"
);
//拿到代理对象3,并绑定真实对象
HelloWorld proxy3=(HelloWorld) new InterceptorJdkProxy().bind(
proxy2,
"com.xfwl.designmodels.responseChain.Interceptor3"
);
//执行代理逻辑
proxy3.sayHelloWorld(); } }
运行结果:
【拦截器3】的before方法
【拦截器2】的before方法
【拦截器1】的before方法
Hello World!
【拦截器1】的after方法
【拦截器2】的after方法
【拦截器3】的after方法
三、观察者模式(例子)
创建一个产品列表类:ProductionList.java
package com.xfwl.designmodels.observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* 创建一个产品列表
* @function
* @author 小风微凉
* @time 2018-7-9 下午4:18:36
*/
public class ProductionList extends Observable {
//产品容器
private List<String> productionList=null;
//单例模式:懒汉式
private static ProductionList instance;
private ProductionList(){}
/**
* 取得唯一实例
* @return 产品列表唯一实例
*/
public static ProductionList getInstance(){
if(instance==null){
instance=new ProductionList();
instance.productionList=new ArrayList<String>();
}
return instance;
}
/**
* 增加观察则(电商接口)
* @param observer 观察者
*/
public void addProductionListObserver(Observer observer){
this.addObserver(observer);
}
/**
* 新增产品
* @param newProudct 新产品
*/
public void addProudct(String newProudct){
this.productionList.add(newProudct);
System.out.println("产品列表新增了产品:"+newProudct);
//告诉观察者,当前被观察者发生了变化
this.setChanged();
//通知观察者,开始相关操作
this.notifyObservers(newProudct);
}
}
创建一个京东电商推送接口类:JingDongObserver.java
package com.xfwl.designmodels.observer; import java.util.Observable;
import java.util.Observer;
/**
* 京东电商接口
* @function
* @author 小风微凉
* @time 2018-7-9 下午4:29:03
*/
public class JingDongObserver implements Observer { @Override
public void update(Observable o, Object product) {
String newProudct=(String)product;
System.out.println("发送新产品【"+newProudct+"】同步到京东商城");
}
}
创建一个淘宝电商推送接口类:TaoBaoObserver.java
package com.xfwl.designmodels.observer; import java.util.Observable;
import java.util.Observer;
/**
* 淘宝电商接口
* @function
* @author 小风微凉
* @time 2018-7-9 下午4:29:03
*/
public class TaoBaoObserver implements Observer { @Override
public void update(Observable o, Object product) {
String newProudct=(String)product;
System.out.println("发送新产品【"+newProudct+"】同步到淘宝商城");
}
}
创建一个测试类:TestObserver.java
package com.xfwl.designmodels.observer;
/**
* 观察者模式测试
* @function
* @author 小风微凉
* @time 2018-7-9 下午4:32:12
*/
public class TestObserver {
/**
* @param args
*/
public static void main(String[] args) {
ProductionList observable=ProductionList.getInstance();
TaoBaoObserver taobao=new TaoBaoObserver();
JingDongObserver jingdong=new JingDongObserver();
observable.addObserver(jingdong);
observable.addObserver(taobao);
observable.addProudct("德芙·巧克力");
}
}
测试结果:
产品列表新增了产品:德芙·巧克力
发送新产品【德芙·巧克力】同步到淘宝商城
发送新产品【德芙·巧克力】同步到京东商城
JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(5):责任链模式、观察者模式的更多相关文章
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(2):SSM+Redis概念理解
一.SSM+Redis的结构图 在Java互联网中,以Spring+SpringMVC+MyBatis(SSM)作为主流框架,SSM+Redis的结构图如下: 二.下面介绍它们各自承担的功能: 1.S ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解
一.关键字说明: oop:面向对象 aop:面向切面 ioc:控制反转 orm:对象关系映射 pojo:数据库表映射的java实体类 二.常识说明:1.hibernate和mybatis都属于持久层. ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(12):XML配置自动扫描包,自动加载*.properties文件
一.XML和注解组合使用 前几篇的测试案例都是在Java类中配置,现在换一种使用方式,在XML中配置,使Spring IoC容器在启动之后自动去扫描配置的包路径,扫描加载指定路径下的propertie ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(10):通过注解(annotation)装配Bean之(@Configguration、@Component、@Value、@ComponentScan、@Autowired、@Primary、@Qualifier、@Bean)
一.通过注解(annotation)装配Bean 通过之前的学习,我们已经知道如何使用XML装配Bean,但是更多的时候已经不再推荐使用XML的方式去装配Bean,更多的时候会考虑注解(annotat ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(8):装配SpringBean概述(如何合理使用装配级别)
一. 装配Bean概述 关于如何将自己开发的Bean配置到Spring IoC容器中,大部分场景下,我们都会使用ApplicationContext的具体实现类,因为对应的Spring IoC容器功 ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(7):装配SpringBean·依赖注入装配
一.依赖注入的三种方式 在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来.另一类则是依赖注入.一般而言,依赖注入可分为3中方式: ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)
一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(11):XML和Annotation装配Bean的混合使用(@ImportResource)
一.XML和Annotation装配Bean如何合理使用 引入第三方资源包中类的时候,建议使用XML配置,而使用自己编写的Java类的时候,推荐使用Annotation注解配置Bean. 二.关于注解 ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(9):通过XML装配Bean
一.通过XML装配Bean 装配简易值 装配集合 命名空间装配(暂不测试) 二.测试例子 创建一个用户类:UserBean.java package com.xfwl.spring.assem; /* ...
随机推荐
- Python学习系列(六)(模块)
Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: ...
- 对象的克隆,Dozer的使用
现在有个复杂对象bean需要在赋值后在另一个地方用,想通过复制的方式拿到这个对象.首选是深度克隆,虽然发现该对象的父类已经实现了Cloneable接口,但父类是通过jar包引入的,而且在clone方法 ...
- vc访问ACCESS数据库
在现代软件开发中,数据库技术被越来越广泛应用,很多项目都存在着大量的数据需要存储,通常都会采用数据库来存储这些数据.最初,数据库厂商推出一个新的数据库产品时,相应的,他会为程序员提供一套访问该数据库的 ...
- TI c6657开发资源
TI 官方论坛:英文 中文 http://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index.html http://e ...
- 【转】 Pro Android学习笔记(九一):了解Handler(5):组件生命
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 对于activity,消息是在OnCrea ...
- 求 s=a+aa+ aaa+ aaaa +aaaaa+........的值,a是从键盘输入的,项数也为键盘输入
总结:这道题目.主要是那个位数,需要*10, while(i<f){ x+=y;//决定位数上的那个数 sum+=x//求和 y*10=y;//决定位数 } package com.b; imp ...
- php爬虫神器cURL
cURL 网页资源(编写网页爬虫) 接口资源 ftp服务器文件资源 其他资源 static public function curl($url, $data = array(), $timeout = ...
- Py修行路 python基础 (十)装饰器
装饰器 一.定义 装饰器:顾名思义,就是对某个东西起到装饰修饰的功能. python中的装饰器,其本质上就是一个python函数,它可以让其他函数在不需要任何代码变动的前提下增加额外功能.通俗理解就是 ...
- Python之select模块解析
首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select ...
- L1,L2范数和正则化 到lasso ridge regression
一.范数 L1.L2这种在机器学习方面叫做正则化,统计学领域的人喊她惩罚项,数学界会喊她范数. L0范数 表示向量xx中非零元素的个数. L1范数 表示向量中非零元素的绝对值之和. L2范数 表 ...