Strategy是属於Behavioral Patterns的其中一种,我个人觉得这个模式非常好用,今天就带给大家认识认识!
假设有个应用程序提供了一个功能,自动规划路线,只要使用者在地图上输入目的地与出发地地址,程序就会显示到达目的地最快的路线图。而这个程序目前只提供汽车行驶道路的路线规划,但随着使用者需求越来越多,程序的功能也跟着需要更新,例如新增规画行人路线的功能,或是规划公共运输的路线,什麽时间点要到哪里搭车等等。
然而随着不同的需求,就会需要不同的演算法来规划路线,如此就会造成规划路线的这个类别,在每一次新增一个演算法时,此类别就会长大一倍,若不幸碰到需更改某个算法,不管是轻微的调整或是错误的修正,都会影响整个类别在程序运行发生错误的机率。
策略模式会将不同的演算法提取出来,并各自为一个单独的类别,接着会需要一个Context类别并具备Strategy类别的属性,使它可以去呼叫该策略的演算法,透过这样的方式,就可以直接新增新的策略或是修改现有的算法,不需要更改Context类别或其他策略类别的程序,彼此也就不会互相影响了。
class Context {
private Strategy strategy;
public void setStrategy(Strategy s) {
this.strategy = s;
}
public Type work() {
strategy.execute(data);
}
}
interface Strategy {
public Type execute(Type data);
}
class ConcreteStrategy1 implements Strategy {
public Type execute(Type data) {
// algorithm1
}
}
class ConcreteStrategy2 implements Strategy {
public Type execute(Type data) {
// algorithm2
}
}
由程序码可以看到,不同的策略就有不同的演算法,可以想像一下,当你选择汽车路线的时候,程序就会帮你设定成规划汽车路线的演算法(例如setStrategy(Strategy CarStrategy)),此时你再点击规划的按钮,Context就会去呼叫CarStrategy的execute()将路线规划出来。
以上就是Strategy的介绍,希望大家可以好好使用此模式(真的很好用XD)。
除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章
juck30808 - Python - 数位行销分析与 Youtube API 教学
SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?
在去年参加 iT 铁人赛挑战时,选择的题目是需要实作(见:30 天开发 Android App 的流...
什麽是API API是Application Programming Interface的缩写。 A...
打开 public 资料夹,我们可以看见熟悉的 index.html,虽然里面塞满了花花绿绿的各种注...
Function of timer and compare functionality of ha...
WebRTC 全名 Web Real-Time Communication,是一个支援网页浏览器进行...