1

我是设计模式的新手,现在我想实现策略模式。这是我的代码:

namespace StrategyPattern
{
    public interface ISendBehavior
    {
        void Send();
    }

    public class SendAppointment : ISendBehavior
    {
        public void Send()
        {
            // send item
        }
    }

    public class SendTask : ISendBehavior
    {
        public void Send()
        {
            // send item
        }
    }

    public class SendItem
    {
        ISendBehavior _sendBehavior;

        public SendItem(ISendBehavior sendbehavior)
        {
            _sendBehavior = sendbehavior;
        }

        public void Send()
        {
            _sendBehavior.Send();
        }
    }

    /* CALL */

    public class Aanroep
    {
        public void Verzenden()
        {
            SendItem app = new SendItem(new SendAppointment());
            app.Send();
        }

    }
}

在 SendAppointment 类的方法 Send 中,项目将被发送。我的问题是,我必须在这个类中连接到数据库吗?如果是这样,那么我还必须连接到 SendTask 中的数据库。但在这一点上,我在重复自己,对吗?因此,如果连接字符串发生更改,我必须在每个类中修改它。我怎么解决这个问题?

4

3 回答 3

2

您可以对数据库操作进行另一层抽象。该层应负责将所有数据库请求集中访问。连接字符串应该在外部配置,数据映射层可以直接访问它们。

存储库模式是您可以应用的这一层的一个很好的模式。它可以位于您的域对象和数据映射层之间。

于 2009-09-22T10:20:59.283 回答
1

用另一个负责数据库连接的对象来初始化 ISendBehavior 的每个实现者怎么样?

您的 Verzenden() 实现将类似于

IDatabaseConnection connection = new DatabaseConnection();

SendItem app = new SendItem( new SendAppointment( connection ) );

并且您的 ISendBehavior.Send() 将像这样实现

_databaseConnection.Send( ... ); // fill behavior-specific information here (perhaps with properties)

这样,您可以将该 IDatabaseConnection 重用于任何其他类。

于 2009-09-22T10:05:24.427 回答
0

既然您不喜欢 Lennaert 将连接传递给您的类的答案,为什么不反转它并创建一个使用简单命令模式的连接类并将您的类作为参数传递给它呢?

于 2010-09-08T23:33:12.680 回答