泡泡

              宠辱不惊-闲看庭前花开花落
                           去留无意-漫观天外云展云舒
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

13)Chain Of Responsibility

Posted on 2007-09-21 13:32  AlanPaoPao  阅读(105)  评论(0)    收藏  举报
    责任链模式的目的是: 为每个对象确定一个职责,并减少每个对象的职责
    实例代码:
class Project
{
  
private int number;     //项目编号
  private double amount;  //预算
  private string purpose; //说明
  public Project(int number, double amount, string purpose)
  
{
    
this.number = number;
    
this.amount = amount;
    
this.purpose = purpose;
  }

  
public double Amount
  
{
    
get return amount; }
    
set { amount = value; }
  }

  
public string Purpose
  
{
    
get return purpose; }
    
set { purpose = value; }
  }

  
public int Number
  
{
    
get return number; }
    
set { number = value; }
  }

}

abstract class Approver
{
  
protected string name;
  
protected double confine;
  
protected Approver successor;
  
protected Approver(string name,double confine)
  
{
    
this.name = name;
    
this.confine = confine;
  }

  
public void SetSuccessor(Approver successor)
  
{
    
this.successor = successor;
  }

  
public abstract void ProcessRequest(Project project);
}

class Director : Approver
{
  
public Director(string name, double confine)
    :
base(name,confine)
  

  }

  
public override void ProcessRequest(Project project)
  
{
    
if (project.Amount < this.confine)
    
{
      Console.WriteLine(
"{0} 批准了# {1}号项目"this.name, project.Number);
    }

    
else if (successor != null)
    
{
      successor.ProcessRequest(project);
    }

    
else
    
{
      Console.WriteLine(
"{0} 无法批准# {1}号项目"this.name, project.Number);
    }

  }

}

class MainApp
{
  
static void Main()
  
{
    Approver director1 
= new Director("director1", 100F);
    Approver director2 
= new Director("director2", 1000F);
    Approver director3 
= new Director("director3", 5000F);
    director1.SetSuccessor(director2);
    director2.SetSuccessor(director3);
    Project p 
= new Project(1008350.00"技术支持");
    director1.ProcessRequest(p);
    p 
= new Project(20083500.10"采购***");
    director1.ProcessRequest(p);
    p 
= new Project(300820000.50"大型系统采购");
    director1.ProcessRequest(p);
    Console.Read();
  }

}