使用接口 - 设计模式方面

时间:2011-03-23 23:43:01

标签: c# .net design-patterns interface

我正在寻找一篇好文章和一篇关于如何使用界面的例子。 我对技术部分并不感兴趣,但我需要设计部分。 例如,如何使用接口进行编程,何时以及如何创建实现,设计用于使用接口进行常规开发的模式。

我有很多类似的课程,可以通过多种方式重复自己。我想使用接口和抽象类来使事情更加模块化 - 但我无法找到如何正确地完成它。

4 个答案:

答案 0 :(得分:13)

接口定义合同。这是一个对象将以某种方式表现的承诺。在学习接口之前,您倾向于用具体的术语来考虑对象。例如,假设我们有一个产品列表:

List<string> products = new List<string>() { "desktop", "laptop", "server" };

我们有一种打印出我们产品的方法:

void PrintProducts(List<string> products)
{
     foreach (string product in products)
     { 
          Console.WriteLine(product);
     }
}

我们的方法与List的具体类型相关联。它需要吗? C#中有很多不同类型的集合:Lists,Arrays,ReadOnlyCollection等。你真正需要做的就是遍历它们。列表有很多方法,数组没有,但你没有在这里使用任何方法。幸运的是,它们都实现了IEnumerable接口。这意味着它们都是“契约约束”以便能够被列举。

更改方法如下:

void PrintProducts(IEnumerable<string> products)
{
     foreach (string product in products)
     { 
          Console.WriteLine(product);
     }
}

表示您现在可以传入数组,列表或您自己创建的某个唯一容器。

另一个例子:假设你有一个数据存储库:

public class DatabaseRepository
{
    public void AddProduct(Product product)
    {
        // connect to the database
        // add the product
    }
}

你有一些需要这个数据库的课程:

public class ProductManager
{
    DatabaseRepository _repository;

    public ProductManager(DatabaseRepository repository)
    {
         _repository= repository;
    }
}

不幸的是,这个类与您的数据库绑定在一起。如果您决定更改为存储为XML文件或存储在某个云键值存储中,该怎么办?您将不得不更改您的ProductManager,这很困难且容易出错。假设我们定义了一个接口:

public interface IRepository {
    void AddProduct(Product product);
}

更改我们的ProductManager类以改为使用此界面:

public class ProductManager
{
    IRepository _repository;

    public ProductManager(IRepository repository)
    {
         _repository= repository;
    }
}

意味着无论它是什么类型的存储库,我们都知道总会有一个方法AddProduct(Product product)。我们现在可以创建我们的XML存储库:

public class XMLRepository : IRepository 
{
    public void AddProduct(Product product)
    {
         // write to an XML file
    }
}

现在,我们可以自由地传入任一存储库:

ProductManager manager = new ProductManager(new DatabaseRepository())

ProductManager manager = new ProductManager(new XMLRepository())

我们的ProductManager行为完全相同。它完全没有意识到具体类型是什么。

当您进入单元测试时,这变得非常有用。当您深入了解界面的工作原理时,您需要阅读“控制反转”。

答案 1 :(得分:2)

This book作为设计模式的规范参考,包含使用接口的示例。但是,您可能希望从更基础的层面开始。 Thinking in Java是我进入面向对象编程的原因,C#可能有类似的标题,尽管本书的内容应该主要与语言无关。您还可以搜索面向对象编程的在线教程。

编辑:关于模式及其在C#中的实现和使用的好书是C# 3.0 Design Patterns

答案 2 :(得分:1)

何时使用界面 界面允许某人从头开始实现您的界面或在其他原始或主要用途与您的界面完全不同的其他代码中实现您的界面。对他们而言,您的界面只是偶然的,必须添加到他们的代码才能使用您的包。缺点是界面中的每个方法都必须是公共的。你可能不想暴露一切。

何时使用抽象类 相比之下,抽象类提供了更多结构。它通常定义一些默认实现,并提供一些对完整实现有用的工具。问题是,使用它的代码必须使用您的类作为基础。如果其他想要使用您的包的程序员已经独立开发了自己的类层次结构,那么这可能会非常不方便。在Java中,类只能从一个基类继承。

或读到这个: http://mindprod.com/jgloss/interfacevsabstract.html

答案 3 :(得分:1)

@Naor,似乎是基于你的上述评论“我为每个班级创建界面似乎不合逻辑 - 对吧?”你阅读的最好的书是HEAD FIRST; DESIGN PATTERNS - 它有一种令人难以置信的简单方法来教授如何使用应用设计模式。我在本书中首先阅读了它们,它确实改变了我的想法!通过阅读本文,您将能够阅读更复杂的内容,例如Martin Fowler, Patterns of Enterprise Application Archtecture - 我相信这些内容非常适合您想要的,现实世界的模式应用。直接去GoF,或者M. Fowler,或者更复杂的东西可能会让你感到困惑,或者让你失去时间。