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

推荐订阅源

V
Visual Studio Blog
爱范儿
爱范儿
GbyAI
GbyAI
博客园 - 叶小钗
Last Week in AI
Last Week in AI
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
云风的 BLOG
云风的 BLOG
C
Check Point Blog
H
Help Net Security
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
大猫的无限游戏
大猫的无限游戏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog RSS Feed
Y
Y Combinator Blog
U
Unit 42
T
Tailwind CSS Blog
MyScale Blog
MyScale Blog
N
Netflix TechBlog - Medium
S
SegmentFault 最新的问题
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

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