atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
6. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client 4
7. 设置哈一个handler,,两个法:排序法,指定法
5
1. 需求:::日期转换
Str2date 也许是通常格式,,2013-01-11 01:02:03
也也许是us格式 2/13/2013 01:02:03
2. 通常方法的问题,一瓦if else 选择结构..
3. 可以选择的模式: 表格模式,责任链模式
日期转换表驱动改进职责链
表驱动(Table driven),其实就是指用查表的方式来获取值。
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
4. 调用代码
List li=new ArrayList();
Date d=
(Date) handleChainUtil.handleReq(li, new Handler(
"ConcreteHandler cn prcsr") {
@Override
public Object handleReq(Object arg) throws ParseException {
return str2date_excpt(source, includeTime);
}
},
new Handler("ConcreteHandler us prcsr") {
@Override
public Object handleReq(Object arg) throws ParseException {
return str2date_excpt(source, includeTime, usFmt);
}
});
Handler bg=(Handler) li.get(0);
System.out.println("---bingo handerl:"+bg.name);
return d;
5. 责任链链的特性:
1. 链是一系列节点的集合。
2. 链的各节点可灵活拆分再重组。
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
职责链是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。
链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,
客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,
并且沿着这条链传递请求,直到有对象处理它为止。由于英文翻译的不同,职责链模式又称为责任链模式,它是一种对象行为型模式。
在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链
6. 模式结构
7. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client
•Handler: 抽象处理者:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
•ConcreteHandler: 具体处理者:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
•Client: 客户端
HandlerChainUtil :这个十俄的总结...来foreach 每结点..
8. 设置哈一个handler,,两个法:排序法,指定法
1. 指定法
pm.Successor = hr;
hr.Successor = manager;
2. 排序法
List 排序..
9. 职责链 != 链表
让我们来看一下链表的典型特征:
1. 链表是一个链状结构,每个节点有一个next属性去指向他的下一节点。
2. 链表有一个Header节点,然后用户每次必须通过头节点,然后去遍历寻找每一个节点。
职责链,我们可以从头将他拿起,也可以从中间将他拿起:
也就是说我们用户可以去访问节点中的任何一个节点作为开始节点,这就是链表与职责链不同的地方
10. 职责链的扩展——树状链结构
职责链中,我们之前看到的都是一些单链结构,但是其实在很多情况下,每一个节点都对应着很多其他的部分。
那么这样,我们的每一个节点都可以使用一个List来维护他节点的下一节点,甚至可以用组合模式来分别设计每一节点
11. 职责链的兜底条款默认的条款:
在我们的职责链中,如果不存在这样的兜底条款,那么用户如果不从首节点开始访问,那么就很可能出现异常的情况。于是我们应该为职责链设置一个默认的条款:
12. 九. 职责链的缺点
让我们继续回到上面的例子,我们发现,其实当请假时间超过2天的时候,PM和HR其实没有做任何的事情,而只是做了一个传递工作。
而传递工作之后,他们就成了垃圾对象。
也就是说,他们在实际的处理中,并没有发挥任何的作用。
那么当这个链结构比较长,比较复杂的话,会产生很多的内存垃圾对象。
这也就是职责链的最大缺点之所在。
13. 模式优缺点
职责链模式的优点
• 降低耦合度
• 可简化对象的相互连接
• 增强给对象指派职责的灵活性
• 增加新的请求处理类很方便
职责链模式的缺点
•不能保证请求一定被接收。
•系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。
14. 职责链的适合领域
如果存在N对N,或者是一般的常规线性关系,那么我们完全可以用表驱动来取代职责链。驱动
用户无论是从哪一个节点作为他的请求头节点,最终用户都可以得到一个请求的反馈。
职责链并非是严格的上下级的传递,其中也包括同级的传递,职责链一样可以在同级之间做传递。
•有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
•在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
•可动态指定一组对象处理请求。
15. 使用中的问题and解决
具体handler详细...use list传类k,在add解决
16. 完全的代码
##1
System.out.println(DateUtil.str2dateX("2/13/2013 01:02:03", true));
##2
public static Date str2dateX(final String source, final boolean includeTime) {
Handler bingo_handler = (Handler) core.new_cglib(Handler.class);
List li=new ArrayList();
Date d=
(Date) handleChainUtil.handleReq(li, new Handler(
"ConcreteHandler cn prcsr") {
@Override
public Object handleReq(Object arg) throws ParseException {
return str2date_excpt(source, includeTime);
}
},
new Handler("ConcreteHandler us prcsr") {
@Override
public Object handleReq(Object arg) throws ParseException {
return str2date_excpt(source, includeTime, usFmt);
}
});
Handler bg=(Handler) li.get(0);
System.out.println("---bingo handerl:"+bg.name);
return d;
}
##3
public class handleChainUtil {
//todox o7g if trans by arr ,is val trans ,,not ref trans ..
//object ya bsin ,yash val trans..only list ok..
public static Object handleReq(List bingo,Handler... proccsor2) {
//Handler bingo=proccsor2[0];
List li =Arrays.asList(proccsor2);
// List li=li2.subList(1, li2.size());
// li.get(0)
final List li_r=new ArrayList ();
Handler bingoPrcsr= (Handler) Any.any(li,new Func_4SingleObj(){
@Override
public Object invoke(Object o) {
Handler p=(Handler) o;
try {
Object rst=p.handleReq("");
li_r.add(rst);
return true;
} catch (ParseException e) {
return false;
}
}});
bingo.add(bingoPrcsr);
return li_r.get(0);
}
##--4
public class Any {
/**
* ret a any elmt
* @param arr
* @param function
* @return
*/@SuppressWarnings("all")
public static <atiType, iptType, retType,retTypeFinnaly> Object any(
atiType arr, Func_4SingleObj function) {
//retTypeFinnaly ja = new tryX<retTypeFinnaly>() {
//
//@Override
//public retTypeFinnaly item(Object t) throws Exception {
//// attilax 老哇的爪子 下午01:34:58 2014-5-26
//return retTypeFinnalyClass.newInstance();
//}
//}.$();
List ia = (List) arr;
// JSONArray arr1=(JSONArray)arr;
List li = (List) arr;
Iterator<iptType> it = li.iterator();
while (it.hasNext()) {
iptType next = it.next();
Boolean invokeRzt = (Boolean) function.invoke(next);
if(invokeRzt)
return next;
}
return ia;
}
17. 参考
重温设计模式(三)——职责链模式(chain of responsibility) - 飞林沙 - 博客园.htm
设计模式之三职责链模式 - vito qi - 博客园.htm
atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换的更多相关文章
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 行为型设计模式之职责链模式(Chain of Responsibility)
结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...
- 设计模式之职责链模式(Chain of Responsibility)
职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...
- atitit.(设计模式1)--—职责链(chain of responsibility)最佳实践O7 转换日期
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 能够选择的模式: 表格模式,责任链模式 1 3 ...
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...
- 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)
责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...
- 职责链模式(Chain of Responsibility)(对象行为型)
1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
随机推荐
- C# conn.open() 外部表不是预期的格式( 读取EXCEL文件出错)
环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...
- Python笔记——break的注意事项
在python中有个控制流的语句:break 它是用来终止循环语句的,不管此时循环体进行到哪,只要碰到break都停止执行循环语句. 1.举例脚本: #!/usr/bin/env python for ...
- ListView和ScrollView冲突
当ListView放在ScrollView中的时候,无论你设置高度为 match_parent(填充父窗体)和wrap_content(包裹内容)都只显示一行,这是你把ListView放在Linear ...
- 第六章 springboot + 事务
在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. mybatis与spring集成后,其事务该怎么做?其实很简单,直接在上一节代码的基础上在相应的方法(通常是servic ...
- C#中不同的线程对控件的更改
.net 不允许跨线程个性其它线程创建的控件. 要想实现这个功能就需要用 InvokeRequired 检查是不是由该线程创建的控件,如果是直接操作,如果不是则 用Invoke 添加一个委托再加上参数 ...
- win7电脑共享VPN连接教程
互通网络VPN服务器不限制连接数,如果仅仅是电脑连接的话有点浪费,如何只在笔记本电脑上设置一次VPN,然后手机.平板等都可以直接共享使用呢?为什么需要笔记本电脑,因为笔记本电脑内置的无线网卡可以设置w ...
- html5 上传图片.net实现
jQuery插件之ajaxFileUpload 搞了一夜,还没弄出来随copy了一篇博客... 一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来, ...
- Ubuntu下配置L2TP
发现PPTP已经不可用了,不知是不是又被墙了.只能尝试L2TP了. Ubuntu可视化配置界面network-manager默认是没有L2TP配置选项的,需要安装第三方插件软件: sudo apt-a ...
- Xml序列化UTF-8格式错误
我需要得到一个类的Xml序列化后的字符串 using (System.IO.MemoryStream mem = new System.IO.MemoryStream()) { XmlTextWrit ...
- 一些CSS常见的小问题小笔记
父元素与子元素之间的margin-top问题: 给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值 解决方法: 1.修改父元素的高度,增加padding-to ...