ChainOfResponsibility.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / TrustUi / MS / Internal / documents / Application / ChainOfResponsibility.cs / 1 / ChainOfResponsibility.cs

                            //------------------------------------------------------------------------------ 
// 
//    Copyright (C) Microsoft Corporation.  All rights reserved. 
//
//  
// An implementation of the 'Chain of Responsibility' from Design Patterns
//  
// 
// History:
//  08/28/2005: [....]: Initial implementation. 
//-----------------------------------------------------------------------------

using System.Collections.Generic;
 
namespace MS.Internal.Documents.Application
{ 
///  
/// An implementation of the 'Chain of Responsibility' from Design Patterns
///  
/// 
/// Design Comments:
///
/// The pattern is implemented as: 
///
///  - concrete coupling of Ts (successors) at construction 
///  - request are represented by ChainOfResponsiblity[T, S].Action delegate 
///    where S is the parameter data
///  - IChainOfResponsibiltyNode[S] is used to determin if the member is willing 
///    to participate in the request.
/// 
/// A common type for all members of the chain.
/// A common type for data for all members of the chain. 
/// 
internal class ChainOfResponsiblity where T : IChainOfResponsibiltyNode 
{ 
    #region Constructors
    //------------------------------------------------------------------------- 
    // Constructors
    //-------------------------------------------------------------------------

    ///  
    /// Provides for concrete coupling of T's at construction.
    ///  
    ///  
    internal ChainOfResponsiblity(
        params T[] members) 
    {
        _members = new List(members);
    }
    #endregion Constructors 

    #region Internal Methods 
    //-------------------------------------------------------------------------- 
    // Internal Methods
    //------------------------------------------------------------------------- 

    /// 
    /// Will dispatch the action first to last in the chain until a member
    /// reports handling the action. 
    /// 
    /// True if successfully handled by a member. 
    /// The action to perform. 
    /// The subject to perform it on.
    internal bool Dispatch(ChainOfResponsiblity.Action action, S subject) 
    {
        bool handled = false;

        foreach (T member in _members) 
        {
            if (member.IsResponsible(subject)) 
            { 
                Trace.SafeWrite(
                    Trace.File, 
                    "Dispatching {0} to {1} using {2}.",
                    action.Method.Name,
                    member.GetType().Name,
                    subject.GetType().Name); 

                handled = action(member, subject); 
                if (handled) 
                {
                    Trace.SafeWrite( 
                        Trace.File,
                       "Finished {0} by {1} with {2}.",
                        action.Method.Name,
                        member.GetType().Name, 
                        subject.GetType().Name);
                    break; 
                } 
            }
        } 
        return handled;
    }
    #endregion Internal Methods
 
    #region Internal Delegates
    //-------------------------------------------------------------------------- 
    // Internal Delegates 
    //--------------------------------------------------------------------------
 
    /// 
    /// Actions which members T can be perform on S.
    /// 
    /// The member to perform the action. 
    /// The subject to perform the action on.
    /// True if handled by the member. 
    internal delegate bool Action(T member, S subject); 
    #endregion Internal Delegates
 
    #region Private Fields
    //-------------------------------------------------------------------------
    // Private Fields
    //-------------------------------------------------------------------------- 

    ///  
    /// The concrete list of members. 
    /// 
    private List _members; 
    #endregion Private Fields
}
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK