IT铁人DAY 16-Strategy 策略模式

  Strategy是属於Behavioral Patterns的其中一种,我个人觉得这个模式非常好用,今天就带给大家认识认识!


问题情境与解析

  假设有个应用程序提供了一个功能,自动规划路线,只要使用者在地图上输入目的地与出发地地址,程序就会显示到达目的地最快的路线图。而这个程序目前只提供汽车行驶道路的路线规划,但随着使用者需求越来越多,程序的功能也跟着需要更新,例如新增规画行人路线的功能,或是规划公共运输的路线,什麽时间点要到哪里搭车等等。

  然而随着不同的需求,就会需要不同的演算法来规划路线,如此就会造成规划路线的这个类别,在每一次新增一个演算法时,此类别就会长大一倍,若不幸碰到需更改某个算法,不管是轻微的调整或是错误的修正,都会影响整个类别在程序运行发生错误的机率。

  策略模式会将不同的演算法提取出来,并各自为一个单独的类别,接着会需要一个Context类别并具备Strategy类别的属性,使它可以去呼叫该策略的演算法,透过这样的方式,就可以直接新增新的策略或是修改现有的算法,不需要更改Context类别或其他策略类别的程序,彼此也就不会互相影响了。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210930/20140743HiLDQZHkTk.png

Skeleton Code

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)。


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  Day 19 不得不变的学习方式

>>:  Day 16 - 函数与物件互动3

输出的重要性

在去年参加 iT 铁人赛挑战时,选择的题目是需要实作(见:30 天开发 Android App 的流...

[Day3] OpenAPI

什麽是API API是Application Programming Interface的缩写。 A...

Day 07 - React 的小小练习

打开 public 资料夹,我们可以看见熟悉的 index.html,虽然里面塞满了花花绿绿的各种注...

Day 12 Develop audio player

Function of timer and compare functionality of ha...

搞懂 P2P 技术 (3) - WebRTC x AWS x KVS

WebRTC 全名 Web Real-Time Communication,是一个支援网页浏览器进行...