当前位置:  开发笔记 > 编程语言 > 正文

战略模式如何运作?

如何解决《战略模式如何运作?》经验,为你挑选了6个好方法。

它是如何工作的,它用于什么以及什么时候应该使用它?



1> e-satis..:

让我们以简单的方式解释策略模式:

你有一个Car()带有方法的类run(),所以你用这种方式用伪语言:

mycar = new Car()
mycar.run()

现在,您可能希望run()在程序执行时动态更改行为.例如,您可能想要模拟电机故障或在视频游戏中使用"提升"按钮.

有几种方法可以进行此模拟:使用条件语句和标志变量是一种方法.策略模式是另一种:它将run()方法的行为委托给另一个类:

Class Car()
{
    this.motor = new Motor(this) 

    // passing "this" is important for the motor so it knows what it is running

    method run()
    {
        this.motor.run()
    }

    method changeMotor(motor)
    {
        this.motor = motor 
    }

}

如果您想改变汽车的行为,您只需更换电机即可.(在程序中比在现实生活中更容易,对吗?;-))

如果你有很多复杂的状态,它会非常有用:你可以更容易地改变和维护它们.


+1很棒的例子!一个提示,值得在changeMotor()里面做stopMotor(),只是为了好玩:)
我喜欢这个答案所以我投票了,但我认为代码可以更详细.
我建议您添加Motor类的代码,它可以帮助更好地理解整个画面.

2> Jorge Córdob..:

问题

策略模式用于解决可能(或预计可能)通过不同策略实现或解决的问题,并且具有针对此类情况的明确定义的接口.每种策略都是完全有效的,某些策略在某些情况下是优选的,允许应用程序在运行时在它们之间切换.

代码示例

namespace StrategyPatterns
{
  // Interface definition for a Sort algorithm
  public interface ISort
  {
    void Sort(List list)
  }

  // QuickSort implementation
  public class CQuickSorter : ISort
  {
    void Sort(List list)
    {
      // Here will be the actual implementation
    }
  }

  // BubbleSort implementation
  public class CBubbleSort : ISort
  {
    void Sort(List list)
    {
      // The actual implementation of the sort
    }
  }

  // MergeSort implementation
  public class CMergeSort : ISort
  {
    void Sort(List list)
    {
      // Again the real implementation comes here
    }
  }

  public class Context
  {
    private ISort sorter;

    public Context(ISort sorter)
    {
      // We pass to the context the strategy to use
      this.sorter = sorter;
    }

    public ISort Sorter
    {
      get{return sorter;)
    }
  }

  public class MainClass
  {
    static void Main()
    {
       List myList = new List();

       myList.Add("Hello world");
       myList.Add("Another item");
       myList.Add("Item item");

       Context cn = new Context(new CQuickSorter());
       // Sort using the QuickSort strategy
       cn.Sorter.Sort(myList);
       myList.Add("This one goes for the mergesort");
       cn = new Context(new CMergeSort());
       // Sort using the merge sort strategy
       cn.Sorter.Sort(myList);
    }
  }
}


结构图像不再可用,您可以更新链接吗?
在"Context"类中获取ISort有什么用?不确定这什么时候有用?

3> Malf..:

什么是战略?战略是旨在实现特定目标的行动计划;

"定义一系列算法,封装每个算法,并使它们可互换.策略允许算法独立于使用它的客户."(Gang of Four);

指定一组类,每个类表示潜在的行为.在这些类之间切换会改变应用程序行为.(战略);

可以在运行时(使用多态)或设计时选择此行为;

捕获接口中的抽象,将实现细节隐藏在派生类中;

在此输入图像描述

策略的替代方法是使用条件逻辑来更改应用程序行为.(坏);

使用此模式可以更轻松地添加或删除特定行为,而无需重新编码和重新测试应用程序的全部或部分内容;

好用途:

当我们有一组类似的算法,并且需要在应用程序的不同部分之间切换它们.使用策略模式可以避免ifs并简化维护;

当我们想要向超类添加新方法时,这些方法对每个子类都没有意义.我们使用一个实例变量代替以传统方式使用接口,我们使用一个实例变量作为新功能接口的子类.这被称为组合:通过继承继承一种能力,该类由具有正确能力的对象组成;


简单而精湛的解释!

4> Bill the Liz..:

直接来自Strategy Pattern Wikipedia的文章:

策略模式对于需要动态交换应用程序中使用的算法的情况非常有用.策略模式旨在提供定义算法族的方法,将每个算法封装为对象,并使它们可互换.策略模式允许算法独立于使用它们的客户端.



5> Andrew Swan..:

一个密切相关的模式是代表模式; 在这两种情况下,一些工作都会传递给其他一些组件.如果我理解正确,这些模式之间的差异就是这个(如果我错了,请纠正我):

Delegate模式中,委托由封闭(委托)类实例化; 这允许通过组合而不是继承来重用代码.封闭类可能知道委托的具体类型,例如,如果它调用其构造函数本身(而不是使用工厂).

策略模式中,执行策略的组件是通过其构造函数或setter(根据您的宗教信仰)提供给封闭(使用)组件的依赖项.使用组件完全不知道正在使用什么策略; 策略总是通过接口调用.

有人知道其他差异吗?



6> I GIVE CRAP ..:

添加到已经很大的答案:策略模式与将函数(或函数)传递给另一个函数有很强的相似性.在策略中,这是通过将所述函数包装在对象中然后传递对象来完成的.有些语言可以直接传递函数,因此它们根本不需要模式.但是其他语言不能传递函数,但可以传递对象; 然后适用该模式.

特别是在类似Java的语言中,您会发现该语言的类型动画园非常小,扩展它的唯一方法是创建对象.因此,问题的大多数解决方案是提出一种模式; 一种组合对象以实现特定目标的方法.具有更丰富类型的动物园的语言通常有更简单的方法解决问题 - 但更丰富的类型也意味着你必须花更多的时间来学习类型系统.具有动态类型规则的语言通常也会以不切实际的方式解决问题.


传递对象; 然后适用该模式.
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有