首页 技术 正文
技术 2022年11月12日
0 收藏 669 点赞 3,707 浏览 4009 个字

Iron之观察者

引言

上一篇说的职责链模式,很有意思的一个模式,今天这个模式也是很有意思的一个模式,还是不啰嗦了直接进入主题吧。

场景介绍:在上一遍中说到用到部件检测,很巧妙的让调用者和处理者解耦了(没有看过上篇的文章也没关系,只是剧情是要接着发展的),要把部件拿去检测是要让个人来盯着看呢?还是部件生产好了自动就被拿去检测了呢?毋庸置疑必须是自动化的。

看一下部件的结构

     /// <summary>
/// 部件
/// </summary>
public class ComponentModel
{
public string Name { get; set; }
public int Value
{
get
{
return ;
}
} }

这个部件还是上一篇的部件,没有做任何改动。只是示例,为了让没看过上一篇的朋友知道。

按照场景里所要求的,定义了下面的两个类型,ComponentModelFactory类型,ComponentModel类型工厂负责生产ComponentModel部件,并且在完成时通知要另外处理部件的对象。
ExecutionCheck类型,就是要要被通知到的对象,它等待着别人告诉它 “有部件生产好了,需要被你送去检测”,不会它会很无聊。

    /// <summary>
/// 示例ComponentModel类型工厂 生产了ComponentModel 通知ExecutionCheck对象去检测
/// </summary>
public class ComponentModelFactory
{
public static ComponentModel ComModelFactory()
{
return new ComponentModel();
}
}
/// <summary>
/// 送ComponentModel对象去检测
/// </summary>
public class ExecutionCheck
{
public void ComponentModelCheck(ComponentModel comModel)
{
//送去执行检测
//或者是一些其他操作
}
}

来看看调用代码:

 ExecutionCheck executionCheck = new ExecutionCheck();
executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory());
executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory());
executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory());

似乎是解决了问题,但是结果糟透了,虽然executionCheck很高兴,因为它有活干了,我只能以这样的方式去通知executionCheck,或许有人说修改下ComponentModelFactory类型会好一点,我知道是这样的:

     public class ComponentModelFactory
{
public static ComponentModel ComModelFactory()
{
return new ComponentModel();
}
public void PastMessage(ComponentModel componentModel,ExecutionCheck executionCheck)
{
executionCheck.ComponentModelCheck(componentModel);
}
}

调用代码则调整为:

 ComponentModelFactory componentModelFactory = new ComponentModelFactory();
ExecutionCheck executionCheck=new ExecutionCheck();
componentModelFactory.PastMessage(ComponentModelFactory.ComModelFactory(), executionCheck);

这样的结果,调用方式没问题了,可是ComponentModelFactory类型的内部居然有着这样高的耦合,无法忍受,必须得找出一种方式或者模式来解决这样的难题,不然寝食难安!!!!

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
                                                                                      
                                                                                                                                       ——Gof

按照模式的定义重新来过(会有点不一样的地方中心思想不变),先对ExecutionCheck 类型进行抽象

     /// <summary>
/// 抽象的ExecutionCheck(抽象观察者)
/// </summary>
public abstract class ABSExecutionCheck
{
public abstract void ComponentModelCheck(ComponentModel comModel);
} /// <summary>
/// 送ComponentModel对象去检测(观察者)
/// </summary>
public class ExecutionCheck:ABSExecutionCheck
{
public override void ComponentModelCheck(ComponentModel comModel)
{
//送去执行检测
//或者是一些其他操作
}
}

然后再对ComponentModelFactory进行改造,并且抽象它。

     /// <summary>
/// 抽象目标
/// </summary>
public abstract class ABSComponentModelFactory
{
protected ABSExecutionCheck absExecutionCheck;
public abstract void RegisterABSExecutionCheck(ABSExecutionCheck executionCheck);
public abstract void ClearABSExecutionCheck();
public abstract void PastMessage(ComponentModel componentModel);
}

ABSComponentModelFactory类型是要让ComponentModelFactory类型实现的,从这里可以看出是遵循设计原则的面对抽象编程的,当然了最后一个PastMessage函数忽略掉,现在来看一下实现了抽象目标ABSComponentModelFactory的ComponentModelFactory(具体目标)的实现。

     /// <summary>
/// 示例ComponentModel类型工厂 生产了ComponentModel 通知ExecutionCheck对象去检测 (具体目标)
/// </summary>
public class ComponentModelFactory:ABSComponentModelFactory
{
public static ComponentModel ComModelFactory()
{
return new ComponentModel();
} public override void RegisterABSExecutionCheck(ABSExecutionCheck executionCheck)
{
absExecutionCheck = executionCheck;
} public override void ClearABSExecutionCheck()
{
absExecutionCheck = null;
}
public override void PastMessage(ComponentModel componentModel)
{
absExecutionCheck.ComponentModelCheck(componentModel);
}
}

现在再来看一下调用的代码:

 ABSExecutionCheck executionCheck = new ExecutionCheck();
ABSComponentModelFactory componentModelFactory = new ComponentModelFactory();
componentModelFactory.RegisterABSExecutionCheck(executionCheck);
componentModelFactory.PastMessage(ComponentModelFactory.ComModelFactory());

这样就比较稳固了,在第一行new ExecutionCheck()的地方可以动态注入,和最后行的工厂生产对象一样。因为这里只是示例就不会很严谨。 还有要说的就是定义中是一对多,这样可以修改ABSComponentModelFactory类型中的字段,修改为集合类型就可以了。 把对应的实现类也适当的修改一下就可以了。

观察者就讲到这里。下一篇是外观,敬请期待。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,947
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,474
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,287
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,102
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,734
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,769