Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 战略和国家设计模式之间的区别,一个国家如何意识到其前身?_Algorithm_Design Patterns_Strategy Pattern_State Pattern - Fatal编程技术网

Algorithm 战略和国家设计模式之间的区别,一个国家如何意识到其前身?

Algorithm 战略和国家设计模式之间的区别,一个国家如何意识到其前身?,algorithm,design-patterns,strategy-pattern,state-pattern,Algorithm,Design Patterns,Strategy Pattern,State Pattern,我在网页和中阅读了关于网站中的状态和策略设计模式。作者说 这种结构可能看起来与战略模式相似,但有一个关键区别。在状态模式中,特定状态可能相互感知,并启动从一个状态到另一个状态的转换,而策略几乎从不知道彼此 作者还说,conceretateclasses存储了一个变量context,它是context类的对象,通过这个变量,状态可以相互感知 有两件事我不明白: 一个国家如何认识其前身 我应该在哪里实现状态间转换的逻辑?例如,state1通过输入a移动到state2,通过b移动到state4,必须在

我在网页和中阅读了关于网站中的状态和策略设计模式。作者说

这种结构可能看起来与战略模式相似,但有一个关键区别。在状态模式中,特定状态可能相互感知,并启动从一个状态到另一个状态的转换,而策略几乎从不知道彼此

作者还说,
conceretate
classes存储了一个变量
context
,它是
context
类的对象,通过这个变量,状态可以相互感知

有两件事我不明白:

  • 一个国家如何认识其前身
  • 我应该在哪里实现状态间转换的逻辑?例如,
    state1
    通过输入
    a
    移动到
    state2
    ,通过
    b
    移动到
    state4
    ,必须在哪里实现该逻辑
  • 这是我用php语言实现的策略的一个简单实现

    <?php
    class Algorithms{
        public $algorithm;
        function __construct(AlgorithmsInterface $algorithm){
            $this->algorithm = $algorithm;
        }
    
        public function run(){
            $this->algorithm->run();
        }
    }
    
    interface AlgorithmsInterface{      
        public function run();
    }
    
    class Algorithm1 implements AlgorithmsInterface{
        public function run(){
            print "Algorithm1";
        }
    }
    
    class Algorithm2 implements AlgorithmsInterface{
        public function run(){
            print "Algorithm2";
        }
    }
    
    
    $payment = new Algorithms(new Algorithm2());
    $payment->run();
    
    
    

    我看不出国家和战略之间有多大区别,但我确切地知道这些战略的意图是什么。除此之外,代码中缺少了状态之间的移动逻辑以及状态应该知道其父状态的方式。

    从您的示例中,这两种模式看起来非常相似。但您的状态设计模式示例并不是真正的状态设计模式,因为您是从外部设置状态。 典型的状态设计模式在内部更改状态,并且通常将更改委托给状态本身。 让我们看看简单的切换按钮。它有一个状态、按下它的方法和描述当前状态的方法(
    toString()
    ):

    因此,从外部看,你没有设置状态,因此你不知道它处于哪种状态以及它将如何反应。您使用:

    button.press();
    System.out.println(button);
    
    所以关键的区别是,对于策略,您从外部传递策略,并让您的对象执行一些操作(这不会改变策略),因此它是粘性委托

    但状态设计模式的目的是,状态应该改变,通常是内在的,随着状态的改变,行为也会改变。因此,即使我们在计算某个任务之前设置了一些状态,它也可能在任务完成过程中发生内部变化(通常是这样)。 这是实现状态多态性的一种方法。还要注意,它通常与状态自动机有关

    class ToggleButton {
        enum State {
            ON {
                public State press() {
                    return OFF;
                }
             },
             OFF {
                 public State press() {
                     return ON;
                 }
             };
             abstract public State press();
        }
    
        State state = State.OFF;
        public void press() {
            state = state.press();
        }
        public String toString() {
            return "Device is " + state;
        }
    }
    
    button.press();
    System.out.println(button);