- 浏览: 778316 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
Netty源码学习-FileRegion -
飞天奔月:
写得有趣 ^_^
那一年你定义了一个接口 -
GoldRoger:
第二个方法很好
java-判断一个自然数是否是某个数的平方。当然不能使用开方运算 -
bylijinnan:
<script>alert("close ...
自己动手实现Java Validation -
paul920531:
39行有个bug:"int j=new Random ...
java-蓄水池抽样-要求从N个元素中随机的抽取k个元素,其中N无法确定
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/** * 业务逻辑:项目经理只能处理500以下的费用申请,部门经理是1000,总经理不设限。简单起见,只同意“Tom”的申请 * bylijinnan */ abstract class Handler { /* 持有一个同类型的引用。有点像链表。网上也有职责链和链表的分析 * 目前我理解两者的不同是: * 1.职责链是变动的,组建职责链时可动态组合 * 2.链表只有一个入口,但职责链可从中间某点开始,跳过一些点 */ protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } //可根据实际情况是否传递参数 public abstract String handleRequest(String user, double fee); } //项目经理 class ProjectManager extends Handler { public String handleRequest(String user, double fee) { String result = ""; if (fee < 500) { if ("Tom".equals(user)) { result = "ProjectManager approved. User = " + user + ", fee = " + fee; } else { result = "ProjectManager rejected. User = " + user + ", fee = " + fee; } } else { if (this.successor != null) { result = this.successor.handleRequest(user, fee); } } return result; } } //部门经理 class DivisionManager extends Handler { public String handleRequest(String user, double fee) { String result = ""; if (fee < 1000) { if ("Tom".equals(user)) { result = "DivisionManager approved. User = " + user + ", fee = " + fee; } else { result = "DivisionManager rejected. User = " + user + ", fee = " + fee; } } else { if (this.successor != null) { result = this.successor.handleRequest(user, fee); } } return result; } } //总经理 class GeneralManager extends Handler { public String handleRequest(String user, double fee) { String result = ""; if ("Tom".equals(user)) { result = "GeneralManager approved. User = " + user + ", fee = " + fee; } else { result = "GeneralManager rejected. User = " + user + ", fee = " + fee; } /*//我们定义总经理是这个流程的最后一环,因此就不再传递了 if (this.successor != null) { result = this.successor.handleRequest(user, fee); } */ return result; } } /** * 扩展一:如果要新增另一个费用的审批流程呢? * 当然可以这样写,在Handler里面新增一个处理流程的方法: * public abstract String handleAnotherRequest(String user, double whateverFee); * 书上介绍了另一个更易于扩展的方法,如下 */ abstract class Handlerr { protected Handlerr successor; public void setSuccessor(Handlerr successor) { this.successor = successor; } /** * 子类应该重写本方法来实现具体的业务逻辑 * @param requestModel 申请业务数据类型 包括申请人、申请金额、费用类型 * @return 处理结果。为兼容不同的返回类型(String or boolean),返回类型设为Object--我觉得这样不好,容易造成混乱 */ public Object handleRequest(RequestModel requestModel) { Object result = null; if (successor != null) { result = this.successor.handleRequest(requestModel); } else { System.out.println("没有后续处理或者暂时不支持后续处理"); } return result; } } //项目经理1.处理OneRequestModel的申请 class ProjectManagerr extends Handlerr { public Object handleRequest(RequestModel requestModel) { Object result = null; //假设只处理类型为OneRequestModel的申请 if (requestModel.getRequestType() == OneRequestModel.TYPE_ONE) { result = this.handleTypeOneRequest(requestModel); } else { result = super.handleRequest(requestModel); } return result; } private Object handleTypeOneRequest(RequestModel requestModel) { String result = null; //这里面的业务逻辑跟之前的ProjectManager是一样的 if (requestModel.getFee() < 500) { if ("Tom".equals(requestModel.getUser())) { result = "ProjectManager approved. RequestModel = " + requestModel; } else { result = "ProjectManager rejected. RequestModel = " + requestModel; } } else { if (this.successor != null) { return this.successor.handleRequest(requestModel); } } return result; } } //项目经理2.处理AnotherRequestModel的申请 class ProjectManagerr2 extends ProjectManagerr { public Object handleRequest(RequestModel requestModel) { Object result = false; //假设只处理类型为AnotherRequestModel的申请 if (requestModel.getRequestType() == AnotherRequestModel.TYPE_ANOTHER) { result = this.handleTypeAnotherRequest(requestModel); } else { result = super.handleRequest(requestModel); } return result; } private Object handleTypeAnotherRequest(RequestModel requestModel) { boolean result = false; //这里面的业务逻辑跟之前的ProjectManager是一样的 if (requestModel.getFee() < 500) { if ("Tom".equals(requestModel.getUser())) { result = true; System.out.println("ProjectManager2 approved. RequestModel = " + requestModel); } else { result = false; System.out.println("ProjectManager2 rejected. RequestModel = " + requestModel); } } else { if (this.successor != null) { return this.successor.handleRequest(requestModel); } } return result; } } class RequestModel { private String user; //申请人 private double fee; //费用 private int requestType; //费用类型 public RequestModel(String user, double fee, int requestType) { this.user = user; this.fee = fee; this.requestType = requestType; } public String getUser() { return user; } public double getFee() { return fee; } public int getRequestType() { return requestType; } public void setUser(String user) { this.user = user; } public void setFee(double fee) { this.fee = fee; } public void setRequestType(int requestType) { this.requestType = requestType; } public String toString() { return "user = " + this.user + ",fee = " + this.fee + ",requestType = " + this.requestType; } } class OneRequestModel extends RequestModel { public static int TYPE_ONE = 1; public OneRequestModel(String user, double fee, int requestType) { super(user, fee, TYPE_ONE); } } class AnotherRequestModel extends RequestModel { public static int TYPE_ANOTHER = 2; public AnotherRequestModel(String user, double fee, int requestType) { super(user, fee, TYPE_ANOTHER); } } /** * 扩展二:功能链。比较典型的应用是Java Web开发里面的filter * 业务逻辑:保存销售信息。保存之前要进行权限检查和数据检查 */ class GoodsSaleBO { /** * 保存商品销售信息 * @param user 销售人员 * @param customer 客户 * @param saleModel * @return true-保存成功 false-保存失败 */ public boolean save(String user, String customer, SaleModel saleModel) { //构建功能链 PrivilegeCheckSaleHandler privilegeCheckSaleHandler = new PrivilegeCheckSaleHandler(); DataCheckSaleHandler dataCheckSaleHandler = new DataCheckSaleHandler(); DataSaveSaleHandler dataSaveSaleHandler = new DataSaveSaleHandler(); privilegeCheckSaleHandler.setSuccessor(dataCheckSaleHandler); dataCheckSaleHandler.setSuccessor(dataSaveSaleHandler); return privilegeCheckSaleHandler.save(user, customer, saleModel); } } abstract class SaleHandler { protected SaleHandler successor; public void setSuccessor(SaleHandler successor) { this.successor = successor; } public abstract boolean save(String user, String customer, SaleModel saleModel); } //权限检查 class PrivilegeCheckSaleHandler extends SaleHandler { public boolean save(String user, String customer, SaleModel saleModel) { if ("Tom".equals(user)) { return this.successor.save(user, customer, saleModel); } else { System.out.println("对不起," + user + ",您没有保存销售信息的权限"); return false; } } } //数据检查 class DataCheckSaleHandler extends SaleHandler { public boolean save(String user, String customer, SaleModel saleModel) { if (emptyStr(user)) { System.out.println("操作人不能为空"); return false; } if (emptyStr(customer)) { System.out.println("客户不能为空"); return false; } if (saleModel == null || emptyStr(saleModel.getGoods()) || 0 == saleModel.getSoldNum()) { System.out.println("SaleModel数据有误"); return false; } return this.successor.save(user, customer, saleModel); } private boolean emptyStr(String str) { return str == null || str.trim().length() == 0; } } //真正保存的操作 class DataSaveSaleHandler extends SaleHandler { public boolean save(String user, String customer, SaleModel saleModel) { System.out.println(user + "保存了如下信息:客户--" + customer + ",销售数据-- " + saleModel); return true; } } class SaleModel { private String goods; //商品名称 private int soldNum; //销售数量 public String getGoods() { return goods; } public void setGoods(String goods) { this.goods = goods; } public int getSoldNum() { return soldNum; } public void setSoldNum(int soldNum) { this.soldNum = soldNum; } public String toString() { return "goods = " + this.goods + ",soldNum = " + this.soldNum; } } /** * 这个类是用来测试的 */ public class ChainOfResponsibilityPattern { public static void main(String[] args) { //测试费用(一种费用)申请 ProjectManager projectManager = new ProjectManager(); DivisionManager divisionManager = new DivisionManager(); GeneralManager generalManager = new GeneralManager(); projectManager.setSuccessor(divisionManager); divisionManager.setSuccessor(generalManager); System.out.println(projectManager.handleRequest("Tom", 499)); System.out.println(projectManager.handleRequest("Tom", 999)); System.out.println(projectManager.handleRequest("Tom", 1999)); System.out.println(projectManager.handleRequest("James", 499)); System.out.println(projectManager.handleRequest("James", 999)); System.out.println(projectManager.handleRequest("James", 1999)); //测试“功能链”:保存销售信息 SaleModel saleModel = new SaleModel(); saleModel.setGoods("iphone5"); saleModel.setSoldNum(10); GoodsSaleBO goodsSaleBO = new GoodsSaleBO(); goodsSaleBO.save("Tom", "Mr.Lee", saleModel); goodsSaleBO.save("Jack", "Mr.Lee", saleModel); } }
发表评论
-
J2EE设计模式-Intercepting Filter
2013-11-27 16:56 1500Intercepting Filter类似于职责链模式 有两种 ... -
《重构,改善现有代码的设计》第八章 Duplicate Observed Data
2012-12-04 20:34 1465import java.awt.Color; impor ... -
读《研磨设计模式》-代码笔记-状态模式-State
2012-10-07 16:56 1382声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-访问者模式-Visitor
2012-10-06 23:43 1043声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-命令模式-Command
2012-10-06 23:40 1163声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-适配器模式-Adapter
2012-09-26 00:23 1365声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-外观模式-Facade
2012-09-25 23:46 1004声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-解释器模式-Interpret
2012-09-23 23:55 1198声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-备忘录模式-Memento
2012-09-23 00:05 1716声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-享元模式-Flyweight
2012-09-21 21:01 1174声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-抽象工厂模式-Abstract Factory
2012-09-21 20:59 955声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-装饰模式-Decorator
2012-09-15 17:56 1156声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-桥接模式
2012-09-12 18:27 1339声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-策略模式-Strategy
2012-09-12 18:24 1060声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-工厂方法模式
2012-08-24 16:57 1138声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-简单工厂模式
2012-08-24 16:56 1086声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-组合模式
2012-08-23 18:13 873声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-模板方法模式
2012-08-23 18:12 1255声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
式工工工工
2012-08-23 00:09 0package pattern; //=========== ... -
读《研磨设计模式》-代码笔记-原型模式
2012-08-21 19:34 1081声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ...
相关推荐
研磨设计模式-配套源代码研磨设计模式-配套源代码
研磨设计模式-配套源代码.rar
研磨设计模式-配套源代码.7z
研磨设计模式第二版-配套源代码 UTF-8格式 研磨设计模式第二版-配套源代码 UTF-8格式
“1.1 设计模式是什么 1.1.1 什么是模式 从字面上理解,模,就是模型、模板的意思;式,就是方式、方法的意思。综合起来,所谓模式就是:可以作为模型或模板的方式或方法。... “研磨设计模式”。 iBooks.
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
1:本源代码是《研磨设计模式》一书的配套源代码 2:每个模式的示例源代码放在一个单独的文件夹下,以该模式的英文名称命名 3:每个模式下分成多个example,按照书的示例顺序分别命名为example1、example2.........
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
单例模式、工厂方法模式、策略模式、命令模式和桥接模式。
研磨设计模式的配套源码,请下载,不要想了,解压后,直接放到eclipse下面即可运行!
研磨设计模式 源代码 书上面的例子都在里面
本电子书一共两个压缩文档,本文件为part2. ...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
研磨设计模式全部源代码,个人收集,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
本电子书一共两个压缩文档,该文档为part1。...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...