zoukankan      html  css  js  c++  java
  • 职责链模式的运用

    最近帮一个mm写一个数字转换为大写的程序,在这里我使用的职责链模式。
    意图:
      使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
    适用性:
    有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    可处理一个请求的对象集合应被动态指定。
     
    首先定义一个处理类
     
    public abstract class Handler
        {
            
    public void SetNextHandler(Handler next)
            {
                
    this.nextHandler = next;
            }
            
    protected Handler nextHandler;
            
    public abstract void ProcessRequest(long nubmer, ref string result);
        }
    这是一个抽象类,因为不同的子类的处理不同
    然后,分别实现 个十百千万亿 这几个具体的处理者
    public class YI : Handler
        {
            
    public override void ProcessRequest(long nubmer, ref string result)
            {
                
    if (nubmer > 100000000)
                {
                    Wang w 
    = new Wang();
                    Qian q 
    = new Qian();
                    Bai b 
    = new Bai();
                    Shi s 
    = new Shi();
                    Ge g 
    = new Ge();
                    w.SetNextHandler(q);
                    q.SetNextHandler(b);
                    b.SetNextHandler(s);
                    s.SetNextHandler(g);
                    w.ProcessRequest(nubmer 
    / 100000000ref result);
                    result 
    += "亿";
                }
                
    if (this.nextHandler != null)
                {
                    
    this.nextHandler.ProcessRequest(nubmer % 100000000ref result);
                }
            }
        }
        
    public class Wang : Handler
        {
            
    public override void ProcessRequest(long nubmer, ref string result)
            {
                
    if (nubmer > 10000)
                {
                    Qian q 
    = new Qian();
                    Bai b 
    = new Bai();
                    Shi s 
    = new Shi();
                    Ge g 
    = new Ge();
                    q.SetNextHandler(b);
                    b.SetNextHandler(s);
                    s.SetNextHandler(g);
                    q.ProcessRequest(nubmer 
    / 10000ref result);
                    result 
    += "";
                }
                
    if (this.nextHandler != null && nubmer % 10000 != 0)
                {
                    
    this.nextHandler.ProcessRequest(nubmer % 10000ref result);
                }
            }
        }
        
    public class Qian : Handler
        {
            
    public override void ProcessRequest(long nubmer, ref string result)
            {
                
    if (nubmer > 1000)
                {
                    Ge g 
    = new Ge();
                    g.ProcessRequest(nubmer 
    / 1000ref result);
                    result 
    += "";
                }
                
    if (this.nextHandler != null && nubmer % 1000 != 0)
                {
                    nextHandler.ProcessRequest(nubmer 
    % 1000ref result);
                }
            }
        }
        
    public class Bai : Handler
        {
            
    public override void ProcessRequest(long nubmer, ref string result)
            {
                
    if (nubmer > 100)
                {
                    
    if (result.Length > 0 && !result.EndsWith(""))
                        result 
    += "";
                    Ge g 
    = new Ge();
                    g.ProcessRequest(nubmer 
    / 100ref result);
                    result 
    += "";
                }
                
    if (nextHandler != null && nubmer % 100 != 0)
                {
                    nextHandler.ProcessRequest(nubmer 
    % 100ref result);
                }
            }
        }
        
    public class Shi : Handler
        {
            
    public override void ProcessRequest(long nubmer, ref string result)
            {
                
    if (nubmer > 10)
                {
                    
    if (result.Length > 0 && !result.EndsWith(""))
                        result 
    += "";
                    Ge g 
    = new Ge();
                    g.ProcessRequest(nubmer 
    / 10ref result);
                    result 
    += "";
                }
                
    if (nextHandler != null && nubmer % 10 != 0)
                {
                    nextHandler.ProcessRequest(nubmer 
    % 10ref result);
                }
            }
        }
        
    public class Ge : Handler
        {
            
    public override void ProcessRequest(long nubmer, ref string result)
            {
                
    if (nubmer < 10)
                {
                    
    string str1 = "零壹贰叁肆伍陆柒捌玖";
                    result 
    += str1[(int)nubmer];
                }
            }
        }
     
    OK,现在每一个单独的节点都已经写好了,客户端的调用
     
    Code
    职责链的运用场景很广,很像我们工厂中的产品加工流水线,原料从入口进去,经过一道道的工序,然后就出来了一个产品。在asp.net中,IHttpHandler就使用了职责链模式
  • 相关阅读:
    在C#代码中应用Log4Net(二)典型的使用方式
    在C#代码中应用Log4Net(一)简单使用Log4Net
    Windows Azure Active Directory (2) Windows Azure AD基础
    Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)
    Windows Azure Active Directory (1) 前言
    Azure China (6) SAP 应用在华登陆 Windows Azure 公有云
    Microsoft Azure News(3) Azure新的基本实例上线 (Basic Virtual Machine)
    Microsoft Azure News(2) 在Microsoft Azure上运行SAP应用程序
    Microsoft Azure News(1) 新的数据中心Japan East, Japan West and Brazil South
    Windows Azure HandBook (2) Azure China提供的服务
  • 原文地址:https://www.cnblogs.com/Linjianyu/p/1491164.html
Copyright © 2011-2022 走看看