欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    [23种设计模式汇总]行为型模式_职责链模式.doc

    • 资源ID:69684179       资源大小:85.50KB        全文页数:13页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    [23种设计模式汇总]行为型模式_职责链模式.doc

    职责链模式意图是对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直道一个对象处理它为止。使用场合1.有多个对象可以处理一个请求,那个对象处理该请求在运行的时候自动确定。2.希望在不明确制定接收者的情况下,向多个对象中的一个提交一个请求。3.可处理一个请求的对象集合应被动态的指定。例如:过滤器:处理或拦截信息,不同的过滤器可以过滤不同的类型的信息,过滤器可以组成职责链模式。时间处理器:不同事件可以有不同的事件处理器,时间处理器组成职责链。然后用户可以不关心事件的类型,交给职责链处理即可。异常处理器:不同的异常处理器对应不同的异常。文法分析器:对给定的进行文法分析,通过扩充职责链扩充文法分析器的功能。分段计算:职责链上的对象在符合条件时进行计算,这样可以去掉语句。结构:定一个处理请求的接口并实现后续链。:处理负责的请求并可访问后继者。如果可以处理该请求,则处理之;否则将该请求转发给后继者。向链上的具体处理对象提交请求。职责链模式构成与执行效率有些情况下,职责链中各对象完成的任务没有包含性,如在文法分析其中各种是平行关系。这时,职责链中对象的顺序对执行结果没有影响。然而由于职责链是串行的德,链中的前一个对象无法完成任务就交给后一个对象完成。因此职责链中对象的顺序组织方式不同,会大大影响程序的执行效率。在组织职责链对象的顺序时,应将较常用的对象放置在链的前端。结果使用职责链降低了请求与响应的耦合性,职责链的顺序可以有用户来决定。采用职责链的不足如果没有适合处理请求的对象,请求将对不到处理。文法分析器四则运算式解析这里我们的目的是将普通中则表达式转化为后则表达式。方案:四则运算式涉及到种,即参与运算的数字、运算符(以及将来肯能扩充的运算符)、左括号(和右括号)。为了方便字符串分割,这里将字符串的格式规定为数值和运算符、运算符与运算符之间都用空格隔开。例如"(_2_+_3_)_/_3"采用ArrayList模拟堆栈Stack.csusing System;using System.Collections;using System.Text;namespace ChainofResposibility.EX24_3 /*/ <summary> / Stact采用ArrayList模拟堆栈 / </summary> class AStack private ArrayList myStact; public int Count get return myStact.Count; public AStack() myStact=new ArrayList(); public void Push(Object o) myStact.Add(o); public Object Pop() int idx = myStact.Count - 1; if (idx < 0) throw new Exception("堆栈已空"); object o = myStactidx; myStact.RemoveAt(idx); return o; public Object Pop2() if (myStact.Count = 0) throw new Exception("堆栈已空"); object o = myStact0; myStact.RemoveAt(0); return o; public bool IsEmpty() return(myStact.Count=0); public object TopItem() int idx = myStact.Count - 1; if (idx<0) throw new Exception("堆栈已空"); object o = myStactidx; return o; 处理四则表达式中token的基础类TreatToken.csusing System;using System.Collections;using System.Text;namespace ChainofResposibility.EX24_3 /*/ <summary> / TreatToken处理四则表达式中token的基础类 / </summary> abstract class TreatToken /用来处理token的临时堆栈 protected AStack st; /用来保存结果的堆栈 protected AStack stOutput; /Next构成职责链 protected TreatToken _next; public TreatToken Next get return _next; set _next = value; public TreatToken(AStack st, AStack stout) this.st = st; this.stOutput=stout; public abstract void Treat(string s); 在这个抽象类中定义了职责链的关系、处理过程中需要用到的堆栈和处理接口。本例有两个Tekon需要处理,即数字和运算符,因为分别对应处理这两种类型的子类: NumberToken.csusing System;using System.Collections;using System.Text;using CommonFrameworkWBs.ValidateTool;namespace ChainofResposibility.EX24_3 /*/ <summary> / NumberToken处理数字 / </summary> class NumberToken:TreatToken public NumberToken(AStack st, AStack stout) : base(st, stout) public override void Treat(string s) ValidateNumber vn = new ValidateNumber(); if (vn.IsNumber(s) this.stOutput.Push(s); else this.Next.Treat(s); 处理数字的部分很简单,只要将数字如栈即可。应为后则表达式通过运算符的顺序控制计算,所以参与运算的数字顺序不变。处理运算符的代码:OperatorToken.csusing System;using System.Collections;using System.Text;namespace ChainofResposibility.EX24_3 /*/ <summary> / OperatorToken处理操作符+-*/()等 / </summary> class OperatorToken:TreatToken private MyOperatoer ope; public OperatorToken(AStack st, AStack stout, MyOperatoer op) : base(st, stout) this.ope = op; public override void Treat(string s) if (s = ope.OP) if (st.IsEmpty() | s = "(") st.Push(ope); else MyOperatoer o = (MyOperatoer)st.TopItem(); while (o.Level >= ope.Level | ope.OP = ")") MyOperatoer o1 = (MyOperatoer)st.Pop(); if (o1.OP = "(") break; this.stOutput.Push(o1); if (st.IsEmpty() break; o=(MyOperatoer)st.TopItem(); if (ope.OP != ")") st.Push(ope); else this.Next.Treat(s); 处理未知的运算符的类:OtherToken.csusing System;using System.Collections;using System.Text;namespace ChainofResposibility.EX24_3 class OtherToken:TreatToken public OtherToken() : base(null, null) public override void Treat(string s) if (s != "") throw new Exception("无法识别的操作符"+s); 负责将组装职责链并完成计算:Parser.csusing System;using System.Collections.Generic;using System.Text;namespace ChainofResposibility.EX24_3 /*/ <summary> / Parser采用职责链将四则元算转化为后表达式 / </summary> class Parser AStack sttemp = new AStack(); AStack stoutput = new AStack(); TreatToken tk; public Parser() NumberToken nt=new NumberToken(sttemp,stoutput); OperatorToken op1 = new OperatorToken(sttemp,stoutput,new MyOperatoer("+",11); OperatorToken op2 = new OperatorToken(sttemp, stoutput, new MyOperatoer("-", 11); OperatorToken op3 = new OperatorToken(sttemp, stoutput, new MyOperatoer("*", 10); OperatorToken op4 = new OperatorToken(sttemp, stoutput, new MyOperatoer("/", 10); OperatorToken op5 = new OperatorToken(sttemp, stoutput, new MyOperatoer("%", 10); OperatorToken op6 = new OperatorToken(sttemp, stoutput, new MyOperatoer("(", 9); OperatorToken op7 = new OperatorToken(sttemp, stoutput, new MyOperatoer(")", 8); OtherToken ot = new OtherToken(); nt.Next = op1; op1.Next = op2; op2.Next = op3; op3.Next = op4; op4.Next = op5; op5.Next = op6; op6.Next = op7; op7.Next=ot; tk = nt; public string Do(string s) string sout = "" string strArr = GetStrList(s); for (int i = 0; i < strArr.Length; i+) tk.Treat(strArri); while (!sttemp.IsEmpty() stoutput.Push(sttemp.Pop(); while (!stoutput.IsEmpty() sout = stoutput.Pop().ToString() + " " + sout; return sout; public AStack ReturnAStack(string s) string strArr = GetStrList(s); for (int i = 0; i < strArr.Length; i+) tk.Treat(strArri); while (!sttemp.IsEmpty() stoutput.Push(sttemp.Pop(); return stoutput; private string GetStrList(string s) string strArr=s.Split(" ".ToCharArray(); return strArr; MyOperatoer.csusing System;using System.Collections;using System.Text;namespace ChainofResposibility.EX24_3 /*/ <summary> / MyOperatoer 操作符和优先级 / </summary> class MyOperatoer private string _ope; private int _level; public MyOperatoer(string o,int l) _ope=o; _level = l; public string OP get return _ope; set _ope = value; public int Level get return _level; set _level = value; public override string ToString() return _ope; CompToken.csusing System;using System.Collections;using System.Text;using ChainofResposibility.EX24_3;namespace ChainofResposibility.EX24_4 abstract class CompToken:TreatToken protected string token = "" public CompToken(AStack st, AStack stout) : base(st, stout) public override void Treat(string s) if (s = token) double b = Convert.ToDouble(this.stOutput.Pop().ToString(); double a = Convert.ToDouble(this.stOutput.Pop().ToString(); double c = Com(a, b); this.stOutput.Push(c.ToString(); else this.Next.Treat(s); public abstract double Com(double a, double b); AddToken.csusing System;using System.Collections;using System.Text;using ChainofResposibility.EX24_3;namespace ChainofResposibility.EX24_4 class AddToken:CompToken public AddToken(AStack st,AStack stout) : base(st,stout) token = "+" public override double Com(double a, double b) return a + b; SubtractionToken.csusing System;using System.Collections;using System.Text;using ChainofResposibility.EX24_3;namespace ChainofResposibility.EX24_4 class SubtractionToken : CompToken public SubtractionToken(AStack st, AStack stout) : base(st,stout) token = "-" public override double Com(double a, double b) return a - b; MultipToken.csusing System;using System.Collections;using System.Text;using ChainofResposibility.EX24_3;namespace ChainofResposibility.EX24_4 class MultipToken : CompToken public MultipToken(AStack st, AStack stout) : base(st,stout) token = "*" public override double Com(double a, double b) return a * b; DivisionToken.csusing System;using System.Collections;using System.Text;using ChainofResposibility.EX24_3;namespace ChainofResposibility.EX24_4 class DivisionToken:CompToken public DivisionToken(AStack st, AStack stout) : base(st,stout) token = "/" public override double Com(double a, double b) return a / b; ModToken.csusing System;using System.Collections;using System.Text;using ChainofResposibility.EX24_3;namespace ChainofResposibility.EX24_4 /*/ <summary> / ModToken / </summary> class ModToken:CompToken public ModToken(AStack st, AStack stout) : base(st,stout) token = "%" public override double Com(double a, double b) return a%b; static void Main(string args) /得到后则表达式 string s = "( 2 + 3 ) / 3" Parser p = new Parser(); Console.WriteLine(s); Console.WriteLine(p.Do(s); Parser px = new Parser(); /计算后则表达式 Computer c = new Computer(px.ReturnAStack(s); Console.WriteLine(c.Do(); Console.ReadLine();相关模式职责链模式经常和组合模式一起使用,在这种情况下父 组件可以作为其在职责链上的后继。

    注意事项

    本文([23种设计模式汇总]行为型模式_职责链模式.doc)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开