Naposledy aktivní 10 months ago

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

Revize cef89fe83fbd0cc839cca55658fd5e9d5ed69acd

data_handler_strategy_data_manager_yaml_json.py Raw
1import time
2import yaml
3import json
4from abc import ABC, abstractmethod
5import streamlit as st
6
7# 策略介面
8class 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 策略
18class 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 策略
28class 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 類別
38class 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 策略
73yaml_handler = YamlHandler()
74data_manager_yaml = DataManager(yaml_handler)
75data_yaml = data_manager_yaml.load_data("path/to/your/yamlfile.yaml")
76data_manager_yaml.save_data("path/to/your/yamlfile.yaml", data_yaml)
77
78# 使用 JSON 策略
79json_handler = JsonHandler()
80data_manager_json = DataManager(json_handler)
81data_json = data_manager_json.load_data("path/to/your/jsonfile.json")
82data_manager_json.save_data("path/to/your/jsonfile.json", data_json)
83