行为型模式之三:策略模式
行为型模式之三:策略模式
刀狂剑痴 发表于2年前
行为型模式之三:策略模式
  • 发表于 2年前
  • 阅读 21
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

策略模式也被叫做政策模式。 这里有关于策略模式的故事,可能Mike驾车有时候会超载,但是不会经常这样。他可能被交警叫停,可能交警是好人,不会罚单和警告(我们叫这类为NicePolice)。也可能被坏警察抓住,并罚单(我们叫这类为HardPolice)。他不知道那种警察会叫停他,直到他被实际抓住,那就是运行时,这就是策略模式整个点。

策略模式类图

策略模式Java代码

定义策略模式接口,拥有一个方法叫 processSpeeding()

public interface Strategy {
  //defind a method for police to process speeding case.
  public void processSpeeding(int speed);
}

现在我们有两种交警

public class NicePolice implements Strategy{
  @Override
  public void processSpeeding(int speed) {
    System.out.println("This is your first time, be sure don't do it again!");		
  }
}
public class HardPolice implements Strategy{
  @Override
  public void processSpeeding(int speed) {
    System.out.println("Your speed is "+ speed+ ", and should get a ticket!");
  }
}

定义一个场景,交警会涉及去处理超速

public class Situation {
  private Strategy strategy;
 
  public Situation(Strategy strategy){
    this.strategy = strategy;
  }
 
  public void handleByPolice(int speed){
    this.strategy.processSpeeding(speed);
  }
}

最后,看看结果

public class Main {
  public static void main(String args[]){
    HardPolice hp = new HardPolice();
    NicePolice ep = new NicePolice();
 
    // In situation 1, a hard officer is met
    // In situation 2, a nice officer is met
    Situation s1 = new Situation(hp);
    Situation s2 = new Situation(ep);
 
    //the result based on the kind of police officer.
    s1.handleByPolice(10);
    s2.handleByPolice(10);        
  }
}

输出

Your speed is 10, and should get a ticket!
This is your first time, be sure don't do it again!

你可以比较这个模式与 状态模式,他们两个很想。最大的区别是,当状态对象修改时,状态模式涉及修改一个对象的状态。策略模式主要是在不同的场景使用不同的算法。 策略模式在JDK中 

1). Java.util.Collections#sort(List list, Comparator < ? super T > c) 

2). java.util.Arrays#sort(T[], Comparator < ? super T > c) 排序方法在不同的场景使用不同的比较器。

想知道更多的例子,请查看: 深入了解Array.sort();

共有 人打赏支持
粉丝 18
博文 111
码字总数 82582
×
刀狂剑痴
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: