设计模式----责任链
来源:互联网 发布:东莞证券软件下载 编辑:程序博客网 时间:2024/04/28 12:35
使用情况描述:某人向银行借钱 借1W一下一般柜员就可以解决,借2W一下一般经理就能解决,如果借更多就需要主管才能解决。
这就是一个责任链,根据条件的不同,分别进行复杂的逻辑运算。
if,switch都可以进行这样的操作,但是需要在每一层进行一次复杂的操作。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
责任链模式的优点
实现了请求者与处理者代码分离:发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。提高系统的灵活性和可扩展行。
缺点:
每次都是从链头开始:这也正是链表的缺点。你也许会想到一种貌似不错的解决方案,比如使用hash映射,将要处理的请求id与处理类对象关联,但是这样系统损失了可扩展性。
public class Loan { public string Name { get; set; } public decimal LoanMoney { get; set; } public Loan(string name,decimal loanDecimal) { Name = name; LoanMoney = loanDecimal; } }<pre class="csharp" name="code">
public class employe { public employe next { get; set; } public virtual void LoanMoneyToSome(Loan loan) { if (loan.LoanMoney < 10000) { Console.WriteLine("employee loan the money!"); } else if (next != null) { next.LoanMoneyToSome(loan); } else { Console.WriteLine("no order"); } } }
public class DeputyManager: employe { public override void LoanMoneyToSome(Loan loan) { if (loan.LoanMoney < 20000) { Console.WriteLine(string.Format("DeputyManager loan {0} money {1}",loan.Name,loan.LoanMoney )); } else if (next != null) { next.LoanMoneyToSome(loan); } else { Console.WriteLine("no power"); } } }
public class manger: employe { public override void LoanMoneyToSome(Loan loan) { Console.WriteLine(" manger loan the money"); } }
class Program { static void Main(string[] args) { Loan l1=new Loan("Jack",9999); Loan l2 = new Loan("tom", 19999); Loan l3 = new Loan("lucky", 29999); employe e = new employe(); e.next=new DeputyManager(); e.next.next=new manger(); e.LoanMoneyToSome(l1); e.LoanMoneyToSome(l2); e.LoanMoneyToSome(l3); Console.ReadKey(); } }
0 0
- 责任链设计模式
- 责任链设计模式
- 设计模式---责任链
- 责任链设计模式
- 设计模式----责任链
- 设计模式-责任链
- 责任链设计模式
- 责任链设计模式
- 设计模式:责任链
- [设计]责任链模式
- 设计模式--责任链
- 责任链设计模式
- 设计模式-责任链设计
- 设计模式----责任链模式
- 【设计模式】责任链模式
- 设计模式---责任链模式
- 设计模式:责任链模式
- 设计模式--责任链模式
- java native关键字
- CKEditor图片上传实现详细步骤(使用Struts 2)
- Android多线程断点下载
- 绑定执行计划sql_plan_baseline
- centos7开机启动mongodb shard cluster
- 设计模式----责任链
- 多线程之CreateThread与_beginthreadex的区别
- 头文件里不要有全局定义
- Leetcode40: Remove Linked List Elements
- 【操作系统】作业管理
- Maven介绍
- Qt多工程多目录的编译案例
- 移动端尺寸基础知识
- 获取联系人的姓名和联系方式,并放到editText中