45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:《GOF设计模式》学习笔记知识

《GOF设计模式》学习笔记知识

2016-09-03 08:18:23 来源:www.45fan.com 【

《GOF设计模式》学习笔记知识

一、官方描述:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
二、我的描述
1、一个简单例子:
记得在上初中的时候,有一个老师非常的特别,他有一个与众不同的习惯,就是同学们的作业是边看边发,他看完一本,点评两句,然后就把本子扔给前排的同学,继续看下一本,前排的同学再把本子往后传,只到传给本子的主人。
现在发现这其实是一个职责链(Chain Of Responsibility)模式的很好的例子,它解除了老师和同学之间的具体关联关系,老师不需要与本子所属的那个同学直接联系,而是只把本子发给前排的同学,就可以假定已经发给了相应的同学,在同学传递本子的时候,检查本子是不是自己的,如果不是,就传递给下一位。
对象结构图如下:
《GOF设计模式》学习笔记知识
2、职责链中的对象关系:
1)对等的对象、位置无关;
2)普化的对象关系,从特殊到一般,位置相关。
老师把本子传给同学,同学根据本子是不是自己的来进行处理,如果是自己的便留下,否则继续往下传。在这里链中的对象(同学)是对等的,所以这个链是对象无关的,即链中的对象(同学)可以互换位置,而不影响处理结果。
在职责链的使用中,链中的对象有时具有层次关系,比如GOF《设计模式》中图形用户界面上的帮助,打印窗口的按钮帮助包含于窗口帮助,窗口帮助又包含于应用帮助。
3、职责链中的对象类型:
1)同一类型的对象;
2)不同类型的对象;
在上面简单例子中,职责链中的对象(同学),都是同一类(Student)的实例,每个同学根据本子的姓名,来决定是接收或是传递给下一个同学。
在职责链模式的运用中,职责链中的对象也可以是不同类型的实例,比如我们构建一个模拟雇用者到人才市场雇用工人劳作的系统,人才市场里的工人包括各种类型,如电工、煤气工、水工等等。
在现实生活中我们有一件事情要找专业的工作人员来做,需要到市场上(当然现在可以直接打电话)找有相应技能的技工,这时我们要根据事情的性质来明确找哪一种技工,并与其联系。但是如果我们要构建一个模拟这一过程的软件系统,我们就可以用职责链模式来解欧雇用者和技工的关系,把技工对象连成一条链,并沿着这条链传递“事情”对象,直到有一个技工可以执行该件“事情”,否则技工对象把这一“事情”对象传给下一个技工对象。类结构及对象结构图如下所示:
类结构图:
《GOF设计模式》学习笔记知识
对象结构图:
《GOF设计模式》学习笔记知识
 
4、职责链的效果:
在上面通过用职责链模式来改造现实中的雇佣者和技工之间的关系,带来了两方面的效果:
1)通过解耦,简化了雇用者的操作,雇用者只需把事情抛给一个技工即可,技工或者自己执行或者传递给下一个技工;
2)人才市场可以方便对技工对象链进行管理,增加或替换删除一些技工,以便完善人才市场,为顾客(雇用者)提供更好的服务;并且这种管理(增加/替换/删除)对顾客是透明的。
5、Java代码示例:
下面代码演示了简单例子中老师给同学发本子的过程,这里的链中对象都属于同一类Student的不同实例,对于链中的对象是不同类型的情况,可以参考GOF《设计模式》中的代码或考虑上面雇佣技工系统的实现。
本部分代码示例包括三个类:Book、Student、和Client
代码清单如下:
类Book,本子类,包括本子的主人名字属性
《GOF设计模式》学习笔记知识packageqinysong.pattern.chainOfResponsibility;
《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
publicclassBook{
《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识
privateStringstudentName;
《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
publicBook(StringstudentName){
《GOF设计模式》学习笔记知识
this.studentName=studentName;
《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
publicStringgetStudentName(){
《GOF设计模式》学习笔记知识
returnstudentName;
《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识
类Student,学生类,包括姓名和下一个同学属性
《GOF设计模式》学习笔记知识packageqinysong.pattern.chainOfResponsibility;
《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
publicclassStudent{
《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识
privateStringname;
《GOF设计模式》学习笔记知识
privateStudentnextStudent;
《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
publicStudent(Stringname,StudentnextStudent){
《GOF设计模式》学习笔记知识
this.name=name;
《GOF设计模式》学习笔记知识
this.nextStudent=nextStudent;
《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
publicvoidacceptBook(Bookbook){
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
if(book.getStudentName().equals(name)){
《GOF设计模式》学习笔记知识System.out.println(
"Student("+name+").acceptBook这是我的本子,我收下了,呵呵!");
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识}
else{
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
if(nextStudent!=null){
《GOF设计模式》学习笔记知识System.out.println(
"Student("+name+").acceptBook这不是我的本子,我传给下一个同学");
《GOF设计模式》学习笔记知识nextStudent.acceptBook(book);
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识}
else{
《GOF设计模式》学习笔记知识System.out.println(
"Student("+name+").acceptBook这不是我的本子,而且我是最后一个同学了,所以本子没人要了!");
《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识
类Client,测试类,包括维护学生链,和向学生链传递本子两部分
《GOF设计模式》学习笔记知识packageqinysong.pattern.chainOfResponsibility;
《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识
//扮演两个角色:1)上下文环境的管理者,构建同学链、2)老师,把本子传给同学链
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识publicclassClient{
《GOF设计模式》学习笔记知识《GOF设计模式》学习笔记知识
publicstaticvoidmain(String[]args){
《GOF设计模式》学习笔记知识System.out.println(
"Client.mainbegin......");
《GOF设计模式》学习笔记知识
//构造同学链
《GOF设计模式》学习笔记知识Studentzhangsan=newStudent("zhangsan",null);
《GOF设计模式》学习笔记知识Studentlisi
=newStudent("lisi",zhangsan);
《GOF设计模式》学习笔记知识Studentwangwu
=newStudent("wangwu",lisi);
《GOF设计模式》学习笔记知识
《GOF设计模式》学习笔记知识
//模拟老师,把李四的本子发出去
《GOF设计模式》学习笔记知识wangwu.acceptBook(newBook("lisi"));
《GOF设计模式》学习笔记知识
//模拟老师,发一个别的班的同学的本子
《GOF设计模式》学习笔记知识wangwu.acceptBook(newBook("xxx"));
《GOF设计模式》学习笔记知识System.out.println(
"Client.mainend......");
《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识}

《GOF设计模式》学习笔记知识
 

本文地址:http://www.45fan.com/dnjc/71627.html
Tags: 学习 笔记 职责
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部