标签:
public class ComponentB { public void Run(ComponentA componentA) { componentA.Say(); } }
class Panel { private Timeline m_timeline; private Scrollbar m_scrollbar; public void Action() { DoSomething(); m_timeline.M1(); m_scrollbar.M2(); } }
class Mediator { private Timeline m_timeline; private Scrollbar m_scrollbar; private Panel m_panel; public void Initialize(Timeline timeline, Scrollbar scrollbar, Panel panel) { m_timeline = timeline; m_scrollbar = scrollbar; m_panel = panel; } public void PanelAction() { m_timeline.M1(); m_scrollbar.M2(); } public void ScrollbarAction() { m_timeline.M1(); m_panel.M3(); } public void TimelineAction() { m_scrollbar.M2(); m_panel.M3(); } } class Panel { Mediator m_mediator; public void Action() { DoSomething(); m_mediator.PanelAction(); } }
如果说前两种实现是形成了3个对象之间的网状图的话,那么第三种实现其实是多加了中介者对象,4个对象形成了以中介者为中心的星状图。
我实际采用了第三种实现来简化对象之间的交互关系。我这里并不想说第三种一定比前两种好,如果没有变化存在,只要是让系统正常工作的代码其实都是好代码。我总是认为,并不是任何时候状态模式就比分支语句更合适一个对象。
public class Program { static void Main(string[] args) { User user = new User(); View ui = new View(user); user.Name = "Hello"; } } delegate void OnNameChange(string name); class View { public View(User user) { user.onNameChanged += user_onNameChanged; } void user_onNameChanged(string name) { Console.WriteLine(name); } } class User { private string m_name; public string Name { get { return m_name; } set { m_name = value; onNameChanged(m_name); } } public event OnNameChange onNameChanged; }
交互即耦合
其实对象交互的方式,本质上就是描述了对象耦合的方式。强耦合的关系一旦面临变化,一般会引起较大范围的改动。众多模式的出现都是为了给对象解耦。
对象之间的交互产生了对象之间的耦合,这是自然而有效的,对象之间就是要通过交互而形成流程,进而完成整个业务。除了上面这些描述的耦合方式,其实还有一个耦合方式更加紧密,那就是继承。
看一段简单的代码:
class Base {} class Derived : Base {}
这样简单的代码,其实就是形成了一个相当紧密的耦合:Base的任何修改都会毫无保留的传递给Derived。
同时,给予这样的一个分析,我们可以解释一个常识:为什么基类要尽量的抽象,不完成特别具体的细节。这么做就是为了尽量维护基类的稳定,让基类尽量不变化。
总结来说,对象交互的常用方式就是:"继承+组合(直接引用)+中介+事件",而这些方式的耦合级别也是基本按这个顺序越来越弱。
标签:
原文地址:http://www.cnblogs.com/dxy1982/p/4520407.html