iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 30
1
自我挑戰組

TypeScript 學習之路並實現 Gof 23 Design Pattern系列 第 30

TypeScript - Flux Design Pattern (30):Flux Pattern

  • 分享至 

  • xImage
  •  

前言

今天是第三十天,就大概來看一下我一直想看的Flux吧!

Flux


說明

是由Facebook提出,且使用在React上,我不太理解為什麼GOF內沒有提到資料流的問題,可能我學術不精不懂吧呵呵。總之Flux並不是一個專屬React上的一個套件或框架,他是一設計模式,後來有跑出一Redux更為大家所愛,不過還是先從Flux開始吧!

解釋

https://ithelp.ithome.com.tw/upload/images/20181030/20109783atEzUvn2cM.png
這一張圖的順序代表的是:

  1. Action發生時
  2. 觸發Dispatcher
  3. 更新Store
  4. 最後改變View

來分別解釋各個的意義!

Action : 動作、方法,可能是增加物件、刪除物件、變更物件、等等的動作物件化(Command Pattern?)
Dispatcher : 中心單位,用於通知所有Store該更新資料,像是Observer Pattern內的Subject!
Store : 儲存資料的地方,可能為多個Store註冊在同一Dispatcher,當資料變更時會是由Dispatcher變更!
View : 顯示操作區域,只會接收資料並不會直接修改資料,修改資料得透過Action!

範例

本範例僅使用Typescript基礎實現Flux概念,並非標準React使用狀況!概念為單向資料流!

//Store.ts
export class Store{
    //這邊就是我們儲存的狀態
    private state:string = '';

    //取得狀態 會由View來這邊取
    public getState():string{
        return this.state;
    }

    //更改狀態
    public changeState(str:string):void{
        this.state = str;
    }   
}

Dispatcher範例為單一Store,複雜的狀況是多Store才是實際遇到的問題,單一Store哪會有這麼多問題哈哈。

import {Store} from './Store';

//在Pattern內就是一種Observer的概念,當數據發生變更時,會通知所有Store要變更,但這邊只有使用單一Store
export class Dispatcher{
    private store:Store;
    constructor(store:Store){
        this.store = store;
    }
    public dispatch(str:string):void{
        this.store.changeState(str);
    }
}

變更的方法物件化,看過其他範例有再多一層ActionType,用途應該就是讓Dispatcher不會直接依賴Action吧?

//Action.ts
import {Dispatcher} from './Dispatcher';
export class Action{
    private dispatcher:Dispatcher;
    //變更事件,綁一個Dispatcher
    constructor(dispatcher:Dispatcher){
        this.dispatcher = dispatcher; 
    }

    public changeState(str:string){
        this.dispatcher.dispatch(str);
    }
}

顯示以及觸發方法的地方,如果在Real Time狀況下,View可監聽Store!監聽其實就是Observer的概念,通知Store變更時要跟View講的意思。範例沒有使用。

import {Action} from './Action';
import {Store} from './Store';

export class View{
    private action:Action;
    private store:Store;

    constructor(store:Store,action:Action){
        this.store = store;
        this.action = action;
    }

    //顯示狀態 會去call getState的方法
    public display():void{
        console.log("State: "+this.getState());
    }

    //如果要編更State需呼叫Action的變更
    public setMyState(str:string):void{
        this.action.changeState(str);
    }
    
    //getState會去抓Store的方法
    private getState():string{      
        return this.store.getState();
    }
    
}

最後Demo囉!

//Demo.ts
import {Action} from './Action';
import {Dispatcher} from './Dispatcher';
import {Store} from './Store';
import {View} from './View';

let store:Store = new Store();
let dispatcher:Dispatcher = new Dispatcher(store);
let action:Action = new Action(dispatcher);
let view:View = new View(store,action);

view.setMyState('Flux');
view.display();

結論

這一設計方法可以有效管理多資料在不同元件產生的問題,我個人認為這是前端框架遇到比較多的問題,因為需要RealTime同步更新多個資料,再不同元件很容易會產生一堆亂七八糟的資料流,所以才統一一個資料流的方式,我在之前撰寫聊天平台時有遇到這個問題,那我後來做法也是類似這樣,只是..Dispatcher直接變成Server,直接把資料倒進最上層的父元件,所有資料來源都是父元件的資料哈哈,但那專案不大,所以可能還撐得住,之後就可以用看看redux看看!

參考

這一範例我覺得很好,有EventEmit監聽的方法 https://github.com/ruanyf/extremely-simple-flux-demo
Facebook的範例教學,比較複雜https://github.com/facebook/flux/tree/master/examples/flux-todomvc


上一篇
TypeScript - Gof 23 Design Pattern (29):Abstract Factory Pattern
系列文
TypeScript 學習之路並實現 Gof 23 Design Pattern30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
SunAllen
iT邦研究生 1 級 ‧ 2018-10-30 18:53:55

恭喜大大完賽/images/emoticon/emoticon42.gif

看更多先前的回應...收起先前的回應...

這是官方BOT留言嗎 還是....
看到經歷 應該是神等級的
嗚嗚喔 感謝

SunAllen iT邦研究生 1 級 ‧ 2018-10-30 20:03:40 檢舉

沒有啦,我不是官方XD

TypeScript 去年有自學一下,然後就真的只是一下/images/emoticon/emoticon02.gif

大大分享的很受用啊,謝謝您!

大大你的鐵人從第三屆就開始了,年紀資歷應該滿深的?!而且主題好多我都看不懂QQ
Typescript我也只是用Java的概念在寫,其實...就是一堆JS奇巧淫技懶得管,直接用最正規的寫法哈哈。我相信大大一定易如反掌的!

SunAllen iT邦研究生 1 級 ‧ 2018-11-01 18:41:48 檢舉

報告,我屬於系統整合工程師的底,網頁程式開發部份,只是知道皮毛中的皮毛=.=

工程師職稱掛的久,可能觸類旁通,輕輕鬆鬆5分鐘就進入狀況了哈哈,反觀像我這種新手,看一個東西還要補五個東西,進度緩慢。目前對資安類的JWT那些關於認證、傳遞等等 超不了解,連關鍵字都是拼拼湊湊,超慢..

0
jojo
iT邦新手 5 級 ‧ 2021-04-29 15:00:25

謝謝大大的知識分享
JOJO已經全部讀完
用TypeScript去表達design Pattern 等設計模式
真的收益匪淺
不然網上,絕大部分都是用JAVA去解說
我也做了筆記,會好好學以致用的
再次感謝

我要留言

立即登入留言