Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改调用者内部的策略模式?_C#_Design Patterns_Strategy Pattern - Fatal编程技术网

C# 修改调用者内部的策略模式?

C# 修改调用者内部的策略模式?,c#,design-patterns,strategy-pattern,C#,Design Patterns,Strategy Pattern,也许战略模式不是我想要的。假设我的代码如下所示(伪版本): 类机器 { 私有堆栈_内部; 公共无效操作(Thingy x) { 开关(x操作) { 案例Op.Foo: DoFoo(); 打破 案例操作栏: 多巴(); 打破 案例Op.Baz: 多巴兹(); } } 私有void DoFoo() { //从内部推动和弹出东西,对那些状态做事情 } 私有无效多巴() { //类似于foo的大型方法,但对_内部做了一些非常不同的事情 } 私人文件 { //你明白了。。。 } } Foo、Bar和Ba

也许战略模式不是我想要的。假设我的代码如下所示(伪版本):

类机器
{
私有堆栈_内部;
公共无效操作(Thingy x)
{
开关(x操作)
{
案例Op.Foo:
DoFoo();
打破
案例操作栏:
多巴();
打破
案例Op.Baz:
多巴兹();
}
}
私有void DoFoo()
{
//从内部推动和弹出东西,对那些状态做事情
}
私有无效多巴()
{
//类似于foo的大型方法,但对_内部做了一些非常不同的事情
}
私人文件
{
//你明白了。。。
}
}
Foo、Bar和Baz是相当复杂的方法(不是很长,只是值得分离),所以我想用一个公共接口,一个la策略模式,将它们划分为类。问题是,我无法在这些类中封装
\u内部
。我的意思是,我可以将它传递到这些类上的
Execute
方法中,但这似乎是一种不好的方法。内部操作的持续时间比单个操作长,因此策略类不能“拥有”内部操作本身。可以在这台机器上执行多种不同的操作,并传入不同的内容

你能推荐一条不同的路线吗

编辑
这是一种状态机,但并不是说一个操作只在特定状态下有效<代码>\内部是一组状态,而不仅仅是当前状态。这三个操作中的任何一个都可以在任何时候完成。

您的策略“策略”似乎是合理的。到目前为止,代码看起来不错,您需要实际声明一个接口,但我认为您已经做到了

我不明白你为什么不能通过考试。这将是接口定义的一部分。成员能够接受一种类型的“:\u internals\u data”或其他内容

你可以总结一下,我定义的接口是

执行

sendinlimitedsubsetofinternals

返回修改后的子组件


然后,这两个数据方法可能只是一个字符串数组,或者是一些真正收紧交互的东西。然后,你可以在中间使用一个序列化,或者某个时间。

我不知道把方法分解成类的想法。所有的类都继承或实现一个公共基础。因此,通过继承限制,确保任何方法都不仅仅是随机方法,而是专门为完成此任务而设计的方法。我想选择这个类的关键标准是,方法是否以不同的方式做相同的事情这可能更像是一个命令模式候选者。你想对内部做完全不同的事情,但你想隐藏这样一个事实,即你是通过有一个“指令”来做事情的?OTOH,如果您在编译时知道有一些类可以做不同的事情,但是需要访问相同的数据,那么您确实需要一个模板基类。
class Machine
{
    private Stack<State> _internals;

    public void DoOperation(Thingy x)
    {
        switch (x.operation)
        {
            case Op.Foo:
                DoFoo();
                break;

            case Op.Bar:
                DoBar();
                break;

            case Op.Baz:
                DoBaz();
        }
    }

    private void DoFoo()
    {
        // pushing and popping things from _internals, doing things to those States
    }

    private void DoBar()
    {
        // similarly large method to foo, but doing something much different to _internals
    }

    private void DoBaz()
    {
        // you get the idea...
    }
}