- 浏览: 112155 次
- 来自: ...
文章分类
最新评论
1. 经典的Visitor模式(循环依赖)
public interface Document
{
void Accept(DocumentVisitor visitor);
}
public class WordDocument : Document
{
public void Accept(DocumentVisitor visitor)
{
visitor.Visit(this);
}
}
public class ExcelDocument : Document
{
public void Accept(DocumentVisitor visitor)
{
visitor.Visit(this);
}
}
public interface DocumentVisitor
{
void Visit(WordDocument wordDocument);
void Visit(ExcelDocument excelDocument);
}
这里面 Document依赖于DocumentVisitor, DocumentVisitor依赖于WordDocument和ExcelDocument, 而WrodDocument等又依赖于Document
这样 Document->DocumentVisitor->WordDocument->Document->...循环依赖
2. 经典的解依赖Visitor模式(Down Cast)
public interface Document
{
void Accept(DocumentVisitor visitor);
}
public class WordDocument : Document
{
public void Accept(DocumentVisitor visitor)
{
if (visitor is WordDocumentVisitor)
{
((WordDocumentVisitor)visitor).Visit(this);
}
}
}
public class ExcelDocument : Document
{
public void Accept(DocumentVisitor visitor)
{
if (visitor is ExcelDocumentVisitor)
{
((ExcelDocumentVisitor)visitor).Visit(this);
}
}
}
public interface DocumentVisitor
{
//空接口, 依赖在这里断掉了
}
public class ExcelDocumentVisitor : DocumentVisitor
{
public void Visit(ExcelDocument excelDocument)
{
}
}
public class WordDocumentVisitor : DocumentVisitor
{
public void Visit(WordDocument wordDocument)
{
}
}
3. 消除无聊Accept()方法的Visitor模式
上面的Accept方法几乎千篇一律, 遵循相同的模式. 里面无非就是类型计算, 可以利用C#的泛型支持将之消除
public interface Document
{
void Accept(DocumentVisitor visitor);
}
public abstract class VisitableDocument<T> : Document where T : VisitableDocument<T>
{
public void Accept(DocumentVisitor visitor)
{
var interfaces = visitor.GetType().GetInterfaces();
foreach (var type in interfaces)
{
if (type.GetGenericArguments().Contains(typeof(T)))
{
((DocumentVisitor<T>)visitor).Visit((T)this);
}
}
}
}
public class WordDocument : VisitableDocument<WordDocument>
{
//不需要自己实现Accept, 基类已经实现
}
public class ExcelDocument : VisitableDocument<ExcelDocument>
{
//不需要自己实现Accept, 基类已经实现
}
public interface DocumentVisitor
{
//空接口
}
public interface DocumentVisitor<T> : DocumentVisitor where T : VisitableDocument<T>
{
//泛型, 依赖在这里断掉了
void Visit(T document);
}
public class PrintDocumentVisitor : DocumentVisitor<WordDocument>, DocumentVisitor<ExcelDocument>
{
public void Visit(WordDocument wordDocument)
{
}
public void Visit(ExcelDocument excelDocument)
{
}
}
发表评论
-
The Object Primer
2004-12-11 11:21 5531,书名 被翻译成“ ... -
错误处理规范
2004-12-11 16:47 733错误处理规范 〇、概念澄清 概念 解释 错误 ... -
Java,误解为何如此之深
2005-08-24 13:50 566前几天被电话面试,问J ... -
Java:画蛇添足的编码规范
2005-09-02 13:13 551前几天公司培训编码规范: 第n条: ... -
synchronized : 规则, 推论与实践
2007-07-23 22:32 43514.3.Synchronization. Rule ... -
交互设计: 股市帮凶
2008-05-04 21:30 616同事 Y 在线操作股票时, 把"买入"点成 ... -
交互设计: 火车上的厕所
2008-05-26 17:17 581有人在动车组的厕所前等了很久, 直到乘务员路过说厕所是被锁住了 ... -
设计原则与模式: 案例介绍--CppUnit
2008-06-01 20:15 576设计原则与模式: 案例介绍--CppUnit CppUnit ... -
工作流:形参,实参,相关数据
2004-12-11 11:40 634关于形参,实参,相关数据 一、形参(FormalParame ... -
工作流:第一次发版,过程总结
2004-12-11 11:42 674交流 即时讨论:小组成员咫尺之遥,有问题立即提出并解决 ... -
工作流:第一次发版,设计总结
2004-12-11 11:43 582整体 面向接口:消息系统,持久系统等,其实现都是可替换 ... -
Beyond Workflow : An Introduction to Vitria BusinessWare
2005-09-26 10:13 782一、简介 Busines ... -
Vitria BusinessWare: 存储与访问安全
2006-03-26 15:45 719事实上,BusinessWare使用LDAP做为存储机制和 ... -
Vitria BusinessWare: 平台与软件总线
2006-04-01 12:59 785经过一段时间的使用 ... -
Vitria BusinessWare: Web Services
2006-04-01 14:30 712BusinessWare的Web Services ... -
Web Services:自洽,编码,交换模型
2006-04-01 16:02 6241, 自洽 以前曾经写过: 目前WebServi ... -
Web Services:WSDL 1.1 规范中的几个错误
2006-04-01 16:40 692读完了WSDL 1.1的规范,令人惊讶的是发现似乎例子中有几个 ... -
C++/CLI:被忽视的集成技术
2006-05-17 20:02 721十几行代码,就使一个重要的旧系统组件,完全融入了基于.Ne ... -
AJP/JK:异构Web平台的集成技术
2006-05-25 21:44 672Tomcat Connector 可以将Tomcat ... -
Vitria BusinessWare: 事件与端口
2006-05-27 17:24 598Event BusinessWare是一个事件驱动的系统 ...
相关推荐
C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型
泛型类、泛型方法、泛型接口、泛型委托 泛型类、泛型方法、泛型接口、泛型委托
C#的泛型C#的泛型
C# 泛型,以及泛型接口的,简单的工厂模式,实现新闻阅览器
c#泛型类、泛型方法、泛型接口、泛型委托
C#泛型集合使用实例C#泛型集合使用实例C#泛型集合使用实例
.net,C# 泛型示例代码.net,C# 泛型示例代码.net,C# 泛型示例代码
C#泛型,非泛型实现枚举功能,通过实现接口方法或者使用迭代器块实现
C#泛型、反射实例,分层,自动生成sql语句
C# 泛型的好处C# 泛型的好处C# 泛型的好处
C#泛型详解文档附实战实例代码,适合C#进阶人群,代码100%能正常运行,有问题可留言!
C# 实现泛型接口
c# 泛型应用实例, c#(vs2008)
C#泛型详解
C#泛型使用小案例 c#经典案例.pdf
在.NET FCL为我们提供了很多...结论:如果在C#2.0版本以上,尽量使用泛型集合类,而不使用非泛型集合类。因为,1. 泛型编程是从c#2.0开始才被.net支持的。2.泛型集合在性能和类型安全方面优于非泛型集 合。 。。。。
C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换
C#【泛型】实现的【通用】结构体转字节数组,包含网上收集的网页参考资料、非通用的【StructTest】工程、泛型实现的通用【Struct2BytesGenericType】工程。 VS2010编译运行。
c#泛型与集合编程.pdf
这是一个泛型委托的示例,主要是让初学者了解泛型委托的用法,虽然很简单,但是代码有注释,我的这个例子是在vs2010中做的,用vs08的朋友们,最好还是转一下,但是绝对能实现(本程序是控制台应用程序,适合初学者)...