Last active 10 months ago

此範例展示策略模式在 YAML 和 JSON 資料處理中的應用,DataHandlerStrategy 定義通用的讀寫介面,並透過 YamlHandler 和 JsonHandler 來處理不同格式的資料。DataManager 負責管理資料存取,並可動態切換處理策略,提高靈活性與可維護性。

timmy revised this gist 10 months ago. Go to revision

No changes

timmy revised this gist 1 year ago. Go to revision

1 file changed, 82 insertions

data_handler_strategy_data_manager_yaml_json.py(file created)

@@ -0,0 +1,82 @@
1 + import time
2 + import yaml
3 + import json
4 + from abc import ABC, abstractmethod
5 + import streamlit as st
6 +
7 + # 策略介面
8 + class DataHandlerStrategy(ABC):
9 + @abstractmethod
10 + def read_data(self, path):
11 + pass
12 +
13 + @abstractmethod
14 + def write_data(self, path, data):
15 + pass
16 +
17 + # YAML 策略
18 + class YamlHandler(DataHandlerStrategy):
19 + def read_data(self, path):
20 + with open(path, "r") as f:
21 + return yaml.safe_load(f)
22 +
23 + def write_data(self, path, data):
24 + with open(path, "w") as f:
25 + yaml.safe_dump(data, f)
26 +
27 + # JSON 策略
28 + class JsonHandler(DataHandlerStrategy):
29 + def read_data(self, path):
30 + with open(path, "r") as f:
31 + return json.load(f)
32 +
33 + def write_data(self, path, data):
34 + with open(path, "w") as f:
35 + json.dump(data, f, ensure_ascii=False, indent=4)
36 +
37 + # DataManager 類別
38 + class DataManager:
39 + def __init__(self, data_handler: DataHandlerStrategy):
40 + self.data_handler = data_handler
41 +
42 + def load_data(self, path):
43 + """
44 + 載入資料
45 + """
46 + return self._load_file(path)
47 +
48 + def save_data(self, path, data):
49 + """
50 + 儲存資料
51 + """
52 + try:
53 + self.data_handler.write_data(path, data)
54 + st.success("資料已成功儲存")
55 + time.sleep(1)
56 + st.rerun()
57 + except Exception as e:
58 + st.error(f"儲存資料過程中發生錯誤:{e}")
59 +
60 + def _load_file(self, path):
61 + """
62 + 通用的文件載入方法
63 + """
64 + try:
65 + return self.data_handler.read_data(path)
66 + except FileNotFoundError:
67 + st.error(f"找不到文件:{path}")
68 + except Exception as e:
69 + st.error(f"載入文件 {path} 時發生錯誤:{e}")
70 + return None
71 +
72 + # 使用 YAML 策略
73 + yaml_handler = YamlHandler()
74 + data_manager_yaml = DataManager(yaml_handler)
75 + data_yaml = data_manager_yaml.load_data("path/to/your/yamlfile.yaml")
76 + data_manager_yaml.save_data("path/to/your/yamlfile.yaml", data_yaml)
77 +
78 + # 使用 JSON 策略
79 + json_handler = JsonHandler()
80 + data_manager_json = DataManager(json_handler)
81 + data_json = data_manager_json.load_data("path/to/your/jsonfile.json")
82 + data_manager_json.save_data("path/to/your/jsonfile.json", data_json)
Newer Older