.NET乐园
一个梦想,一个行动…… (欢迎光临我的淘宝http://pipis.taobao.com,专营户外手电筒、头灯、营地灯、自行车灯)
动机:在系统构建过程中,经常出现多个对象相互关联交互的情况,对象之间常常会维持一种复杂的引用关系,面对变化能力弱。用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的变化。
 
场景:考虑一个文本编辑器,包含剪切菜单、粘帖按钮、文本编辑区域、剪贴板等对象,它们需要相互引用和交互。

结构



代码

namespace DesignPattern.Mediator
{
    
public abstract class Mediator
    
{
        
private IList<Control> controls;

        
public Mediator()
        
{
            controls 
= new IList<Control> ();
        }


        
// 管理交互
        public abstract void ControlChanged(Control control);

        
public void Add(Control control)
        
{
            controls.Add(control);
        }

    }


    
public class CutMediator : Mediator
    
{
        
public CutMediator()
            : 
base()
        
{
        }


        
public override void ControlChanged(Control control)
        
{
            
if (control is CutMenuItem)
            
{
            }

            
else if (control is PasteButton)
            
{
            }

            
else if (control is TextArea)
            
{
            }

            
else if (control is ClipBoard)
            
{
            }

        }

    }

}

namespace DesignPattern.Mediator
{
    
public abstract class Control
    
{
        
private Mediator mediator;

        
public Control(Mediator mediator)
        
{
            
this.mediator = mediator;
        }


        
public virtual void Changed()
        
{
            mediator.ControlChanged(
this);
        }

    }


    
public class CutMenuItem : Control
    
{
        
public CutMenuItem(Mediator mediator)
            : 
base(mediator)
        
{
        }


        
public override void Changed()
        
{
            
//
            base.Changed();
        }

    }


    
public class PasteButton : Control
    
{
        
public PasteButton(Mediator mediator)
            : 
base(mediator)
        
{
        }


        
public override void Changed()
        
{
            
//
            base.Changed();
        }

    }


    
public class TextArea : Control
    
{
        
public TextArea(Mediator mediator)
            : 
base(mediator)
        
{
        }


        
public override void Changed()
        
{
            
//
            base.Changed();
        }

    }


    
public class ClipBoard : Control
    
{
        
public ClipBoard(Mediator mediator)
            : 
base(mediator)
        
{
        }


        
public override void Changed()
        
{
            
//
            base.Changed();
        }

    }

}


 要点: 
      1、本模式将多个对象间复杂的关联关系解耦,对多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统维护,能更好地面对变化。
      2、随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂,这时候可对其进行分解处理。
      3、Facade模式是解耦系统外到系统内(单向)的对象关联关系;本模式是解耦系统内各个对象之间(双向)的关联关系。
posted on 2007-07-26 12:49  Charly  阅读(472)  评论(0编辑  收藏  举报