惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园 - Charly

我的电影记录 再去听他的演唱会 学友12月29日广州演唱会 张学友十大粤语&十大国语金曲赏析 妈妈的第二次重生 随便谈谈最近参与的2个项目 中奖的幸运与不幸 设计模式学习笔记二十五——总结 Moss2007搜索服务配置,没有索引器和搜索配置页面报错问题解决 设计模式学习笔记二十四——Visitor模式 设计模式学习笔记二十三——TemplateMethod模式 设计模式学习笔记二十二——Strategy模式 设计模式学习笔记二十一——State模式 设计模式学习笔记二十——Memento模式 设计模式学习笔记十九——Observer模式 在MOSS 2007中调试WebPart 设计模式学习笔记十七——Iterator模式 设计模式学习笔记十六——Interpreter模式 设计模式学习笔记十五——Command模式
设计模式学习笔记十八——Mediator模式
Charly · 2007-07-26 · via 博客园 - Charly

动机:在系统构建过程中,经常出现多个对象相互关联交互的情况,对象之间常常会维持一种复杂的引用关系,面对变化能力弱。用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的变化。
 
场景:考虑一个文本编辑器,包含剪切菜单、粘帖按钮、文本编辑区域、剪贴板等对象,它们需要相互引用和交互。

结构

代码

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模式是解耦系统外到系统内(单向)的对象关联关系;本模式是解耦系统内各个对象之间(双向)的关联关系。