- 浏览: 121987 次
- 来自: ...
-
文章分类
最新评论
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 6131,书名 被翻译成“ ... -
错误处理规范
2004-12-11 16:47 771错误处理规范 〇、概念澄清 概念 解释 错误 ... -
Java,误解为何如此之深
2005-08-24 13:50 600前几天被电话面试,问J ... -
Java:画蛇添足的编码规范
2005-09-02 13:13 648前几天公司培训编码规范: 第n条: ... -
synchronized : 规则, 推论与实践
2007-07-23 22:32 49014.3.Synchronization. Rule ... -
交互设计: 股市帮凶
2008-05-04 21:30 661同事 Y 在线操作股票时, 把"买入"点成 ... -
交互设计: 火车上的厕所
2008-05-26 17:17 627有人在动车组的厕所前等了很久, 直到乘务员路过说厕所是被锁住了 ... -
设计原则与模式: 案例介绍--CppUnit
2008-06-01 20:15 661设计原则与模式: 案例介绍--CppUnit CppUnit ... -
工作流:形参,实参,相关数据
2004-12-11 11:40 689关于形参,实参,相关数据 一、形参(FormalParame ... -
工作流:第一次发版,过程总结
2004-12-11 11:42 721交流 即时讨论:小组成员咫尺之遥,有问题立即提出并解决 ... -
工作流:第一次发版,设计总结
2004-12-11 11:43 636整体 面向接口:消息系统,持久系统等,其实现都是可替换 ... -
Beyond Workflow : An Introduction to Vitria BusinessWare
2005-09-26 10:13 812一、简介 Busines ... -
Vitria BusinessWare: 存储与访问安全
2006-03-26 15:45 766事实上,BusinessWare使用LDAP做为存储机制和 ... -
Vitria BusinessWare: 平台与软件总线
2006-04-01 12:59 871经过一段时间的使用 ... -
Vitria BusinessWare: Web Services
2006-04-01 14:30 780BusinessWare的Web Services ... -
Web Services:自洽,编码,交换模型
2006-04-01 16:02 7131, 自洽 以前曾经写过: 目前WebServi ... -
Web Services:WSDL 1.1 规范中的几个错误
2006-04-01 16:40 752读完了WSDL 1.1的规范,令人惊讶的是发现似乎例子中有几个 ... -
C++/CLI:被忽视的集成技术
2006-05-17 20:02 797十几行代码,就使一个重要的旧系统组件,完全融入了基于.Ne ... -
AJP/JK:异构Web平台的集成技术
2006-05-25 21:44 735Tomcat Connector 可以将Tomcat ... -
Vitria BusinessWare: 事件与端口
2006-05-27 17:24 707Event BusinessWare是一个事件驱动的系统 ...
相关推荐
在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...
让我们深入探讨一下为什么我们需要使用泛型: 1. **类型安全**:泛型提供了编译时的类型检查,确保在操作泛型容器时使用的数据类型与容器所期望的类型一致。这避免了运行时的类型转换异常,提高了代码的可靠性。 2...
在C#中,泛型主要体现在以下几个方面:泛型类、泛型接口、泛型方法、泛型委托以及泛型集合。 1. **泛型类**:泛型类是在声明类时定义一个或多个类型参数。例如,`List<T>` 就是一个典型的泛型类,其中 `T` 是类型...
在C#编程语言中,泛型是一个强大的特性,它允许我们编写可重用的代码,同时保持类型安全和性能。泛型主要分为四个关键部分:泛型类、泛型方法、泛型接口和泛型委托。下面将详细介绍这四个方面。 1. 泛型类: 泛型类...
总的来说,结合C#的泛型、泛型接口、简单工厂模式以及序列化技术,我们可以构建一个灵活且高效的新闻阅览器,它能够处理各种类型的新闻数据,同时保持良好的代码结构和可扩展性。通过这样的设计,开发者可以轻松地...
C#泛型是一种强大的编程工具,它为C#程序员提供了更大的灵活性和性能优化。泛型在.NET Framework 2.0中被引入,旨在解决传统集合类(如ArrayList)在处理不同类型数据时存在的性能和类型安全问题。以下是关于C#泛型...
在C#中,泛型主要体现在类、接口、方法、委托和集合中。 1. **泛型类**:泛型类定义了一个通用的类型参数,用户在实例化时可以指定具体的类型。例如,`List<T>`就是一个泛型类,T代表一个类型参数,可以是任何引用...
C#的泛型是一种强大的功能,它允许程序员创建能够处理任何数据类型的类、接口或方法。通过泛型,可以在编写一次代码的基础上处理多种不同类型的对象,提高了代码的灵活性与重用性。泛型的关键在于“参数化类型”,即...
本篇文章将详细探讨C#中的泛型、反射以及如何利用这些特性来实现自动生成SQL语句。 **一、C# 泛型** 泛型是C#的一个核心特性,它允许我们编写类型参数化的代码,即代码可以在多种数据类型上工作,而无需进行显式的...
在C#编程语言中,泛型接口是一种强大的工具,它允许开发者定义一组可以在不同数据类型上操作的方法。泛型接口的使用可以极大地提高代码的复用性和灵活性,同时确保类型安全。下面我们将深入探讨C#泛型接口的概念、...
C# 泛型是.NET框架中的一个重要特性,它允许开发者创建可重用的类型化代码,这些代码可以处理多种数据类型。在C#(Visual Studio 2008及更高版本)中,泛型提供了类型安全性和性能优势,因为它们避免了在运行时进行...
泛型是C#编程语言中的一个核心特性,它在C# 2.0版本中引入,极大地增强了代码的灵活性和可重用性。泛型允许开发者定义类型参数化的类、接口和方法,使得数据结构和算法可以独立于具体的数据类型进行操作。这样,...
在C#编程语言中,泛型集合是一种强大的工具,它允许开发者创建类型安全的数据结构,无需显式地指定存储的数据类型。泛型集合提供了一种高效且灵活的方式来处理各种类型的数据,同时保持了编译时的类型检查。下面将...
.net,C# 泛型示例代码.net,C# 泛型示例代码.net,C# 泛型示例代码
在"高级无敌,c#泛型例子"这个主题中,我们将深入探讨C#泛型的基本概念、优势以及如何实际应用。 首先,泛型是C#中引入的一种类型参数化机制。在定义类或方法时,我们可以使用类型参数(如`T`)来代替具体的类型,...
下面我们将详细探讨如何在C#中使用泛型实现枚举功能,以及非泛型实现的替代方法。 首先,让我们理解什么是泛型。在C#中,泛型允许我们创建可重用的数据结构和方法,这些结构和方法可以操作任何数据类型。这大大提高...
编程选择题40道:泛型:类型安全与泛型编程.Tex.docx
C#泛型是.NET框架中的一个强大特性,它允许我们创建可重用的类型,这些类型可以在多种数据类型上工作,而无需重复编写相同代码。泛型的主要目标是提高代码的类型安全性和性能,同时减少类型转换的需要。在本文中,...
C#泛型使用小案例 c#经典案例.pdf
C#中的泛型类是编程中的一个重要概念,它允许我们创建可以处理多种数据类型的类,提高了代码的重用性和效率。下面将详细讲解泛型类的各个方面。 1. **泛型类的基本应用** 泛型类的核心在于类型参数,这使得类能够...