第十九讲:职责链模式


 

public class CarBodyHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车身");}}
public abstract class CarHandler {public abstract void HandlerCar();
}
public class CarHeadHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车头");}}
public class CarTailHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车尾.");}}
public class MainClass {public static void main(String[] args) {CarHandler headH =  new CarHeadHandler();CarHandler bodyH =  new CarBodyHandler();CarHandler tailH =  new CarTailHandler();//这种方式的缺点是客户端必须手动地调用HandlerCar()//像SERVLET的容器的过滤器的框架的实现是自动的.//就是组装完车头之后你自己组装车身,组装车尾.//我把一个流程给你以后:是先组装车头还是先组装车身.你按照我给定的流程你来执行.//对象的组织-消息的传递-职责的分配-任务的完成
        headH.HandlerCar();bodyH.HandlerCar();tailH.HandlerCar();}
} 

这是非责任链模式的代码.组装一辆汽车的应用场景.


 

ConcreteHandler:CarHeadHandler.java、CarTailHandler.java、CarBodyHandler.java

Handler:CarHandler.java  Hander有一条线是对自身的引用.

车头持有车身的引用,车身持有车尾的引用.每次执行完自己的方法的时候调用下一个节点的方法继续执行.


 

缺点:因为一个对象总是要调用链的下一个对象进行处理,如果中间有一个对象或者是实现出现了问题就会影响处理速度.


 

package com.ibeifeng.ex2;public class CarBodyHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车身");if(this.carHandler!=null){this.carHandler.HandlerCar();}}}
package com.ibeifeng.ex2;public class CarHeadHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车头");if(this.carHandler!=null){this.carHandler.HandlerCar();}}}
package com.ibeifeng.ex2;public class CarTailHandler extends CarHandler{@Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车尾.");if(this.carHandler!=null){this.carHandler.HandlerCar();}}}
package com.ibeifeng.ex2;public abstract class CarHandler {protected CarHandler carHandler;//protected属性子类可以访问...//private CarHandler carHandler;//持有自身的引用./*    public void setNextHandler(CarHandler carHandler){this.carHandler =  carHandler;}*/public CarHandler setNextHandler(CarHandler carHandler){this.carHandler =  carHandler;return this.carHandler;}public abstract void HandlerCar();
}
package com.ibeifeng.ex2;public class MainClass {public static void main(String[] args) {CarHandler headH =  new CarHeadHandler();CarHandler bodyH =  new CarBodyHandler();CarHandler tailH =  new CarTailHandler();//这种方式的缺点是客户端必须手动地调用HandlerCar()//像SERVLET的容器的过滤器的框架的实现是自动的.//就是组装完车头之后你自己组装车身,组装车尾.//我把一个流程给你以后:是先组装车头还是先组装车身.你按照我给定的流程你来执行.//对象的组织-消息的传递-职责的分配-任务的完成
/*        headH.HandlerCar();bodyH.HandlerCar();tailH.HandlerCar();*///不需要调用三个类的方法了,而是把顺序预先设定好.//组装顺序预先设定好,顺序是车头->车身->车尾headH.setNextHandler(bodyH);//把第二个设置到第一个里面
        bodyH.setNextHandler(tailH);//调用职责链的链头来完成操作
        headH.HandlerCar();System.out.println("------------------------------");//顺序改变,希望是车身->车头->车尾
        bodyH.setNextHandler(headH);headH.setNextHandler(tailH);bodyH.HandlerCar();System.out.println("--------------------------------------");//简便操作
        bodyH.setNextHandler(headH).setNextHandler(tailH);bodyH.HandlerCar();}
} 

 

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6746879.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十道解分式方程及答案_100道八年级分式方程及答案.

天.一辈子也打不完哪.再问: 50到吧再答: http://zhidao.baidu.com/question/238264424.html 个网址里面有一些,因为有字数限制,我不好发题目给你,所以你自己去看看吧。 例 解方程: (1)2xxx31; (2)15x215 x1…

四阶行列式直接展开_四阶行列式的完全展开式共有多少项

展开全部 共24项。 1.将该行列式前三列重复书写在该行列式的右边,可在前四列中作出两条对角线,然e5a48de588b662616964757a686964616f31333365663463后在此七列中作出相应的平行线,可得(图表一) 2.作乘积关系,可得如下八项: a11a22a33a44,a12a23a34a41,a13a24a31a42,a14a2…

c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...

I.11: 永远不要使用原始指针(T*)或引用(T&)来转移所有权原因如果对调用者或被调用者是否拥有对象有任何疑问,就会发生泄漏或过早析构。示例考虑:X* compute(args) // 不要这样做 { X* res new X{}; // ... return res; }谁来删除返回的X?当compute返…

for-each循环

for-each循环又叫for增强循环,不需要下标就可以顺序的便历整个数组例如 package cn.hsop.fentian;public class Forxunhuan {public static void main(String[] args) {int[] num { 5, 8, 3, 6 };//定义数组int maxnum[0] ;//假设最大值//遍历数组for (int a : num…

mysql8.0.13 32位下载_MySQL8.0下载-MySQL数据库8.0下载 v8.0.11官方版(32位/64位)--pc6下载站...

mysql是一款数据库管理系统,mysql一般网站开发者或者数据库开发者会用到,mysql拥有体积小巧、读取和存储速度快的特点,新版本完全脱了MylSAM存储引擎,改善了扫描性能,同时还重构了sql分析器,赶快下载使用吧…

处理有外键约束的数据

mysql SET FOREIGN_KEY_CHECKS 0; delete from approval_info;delete from approval_manage;delete from site_message;delete from works;delete from works_theme;SET FOREIGN_KEY_CHECKS 1; oracle drop tablename no CONSTRAINT 还有一个本办法就是 一个一个的找到主…

mysql clickhouse_通过mysql操作clickhouse

mysql软件安装至少需要安装一个mysql客户端,即要有mysql这个命令;也可以直接安装一个mysql数据库,不用可以不启动;clickhouse服务端配置mysql端口vim /etc/clickhouse-server/config.xml9004修改服务器端配置,需要重启…

手游产品经理初探(三)产品中的玩家行为

国内做手游的团队非常多都是一大抄,但非常多时候我们都没有抄到核心的东西,所谓的形象神不象就是这样。那么我们来看一个案例:这个界面是big fish做的玩家送礼物的画面。我们知道在社交类的游戏里面这是一个非经常见的功能,但非常…

mysql shell 所有表_删除mysql数据库中所有表的shell脚本

分享一个可以删除mysql中所有表的shell脚本,代码如下:复制代码 代码示例:#!/bin/bash# 删除mysql中所有表# 示例:# Usage: ./script user password dbnane# Usage: ./script user password dbnane server-ip# Usage: ./script user password …

gbdt和xgboost中feature importance的获取

来源于stack overflow,其实就是计算每个特征对于降低特征不纯度的贡献了多少,降低越多的,说明feature越重要 Ill use the sklearn code, as it is generally much cleaner than the R code. Heres the implementation of the feature_importances proper…

mysql数据库服务器名_mysql数据库服务器名

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…

python基础01

1、python介绍及与其它开发语言比较: 相比C、Java运行慢,但是代码简介,可以减小学习成本,加快项目进度。跨平台,支持Linux和Windows。 C语言是所有高级语言的基础,若要研究python语言的原理,需要…

mysql中的删除语法错误_mysql – EXPLAIN中的SQL语法错误

我试图让一个解释命令在mysql中工作.我正在尝试解决此删除查询的性能问题:DELETE FROM boost_cache_relationshipsWHERE base_dir cache/normal/www.dane101.comAND page_callback nodeAND page_type storyAND page_id 2891;此查询是SHOW FULL PROCESSLIST命令的…

[转]ClassPath是什么

from: https://my.oschina.net/GivingOnenessDestiny/blog/603505 classpath 是什么classpath实际上就是编译后的 以 classes 文件夹为起点的路径 各种path获取到的路径的区别 Main.class.getResource("");-> 得到的是当前class所在的路径 Main.class.getResource…

mysql group关键字_Mysql关键字之Group By(一)

原文地址,优先更新https://hhe0.github.iogroup by 是一个我们在日常工作学习过程中经常遇到的一个Mysql关键字。现总结其用法如下,内容会不断补充,出现错误欢迎批评指正。我们先准备一张表和一些记录我们首先创建学生的成绩表courses:CREATE…

【LeetCode】031. Next Permutation

题目: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). Th…

mysql ndb是什么_MySQL NDB Cluster介绍

最近翻译了好几篇关于NDB的文章,相信有很多人会有疑问,NDB Cluster究竟是个什么东西?它是一款新产品吗?它和InnoDB Cluster有什么不同?它是MySQL吗?它怎么使用?在这篇文章里,我将为大…

jQuery遍历,数组,集合

使用了jquery有段时间了&#xff0c;整理下jquery中的遍历问题。 1.jquery 遍历对象 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">< HTML> <HEAD> <TITLE> New Document </TITLE> <script language"…

orm和mysql_orm与mysql

一. orm执行原生sql语句在模型查询API不够用的情况下&#xff0c;我们还可以使用原始的SQL语句进行查询。Django 提供两种方法使用原始SQL进行查询&#xff1a;一种是使用raw()方法&#xff0c;进行原始SQL查询并返回模型实例&#xff1b;另一种是完全避开模型层&#xff0c;直…

课程作业2

作业二 题目 编写一个程序&#xff0c;要求根据给定的圆的半径求圆的面积&#xff0c;并将求得的结果打印出来。 要求&#xff1a; 输入输出采用cin和cout。 建立一个工程&#xff0c;将程序写成两个.cpp和一个.h的形式。 要求程序必须要对变量的定义和各个函数模块进行注释。 …