데이터 카드 목록에서 필터 기능을 효율적으로 구현하기 위해 어댑터 디자인 패턴을 사용할 수 있습니다. 어댑터 패턴을 사용하면 기존 데이터 카드 구조에 영향을 주지 않고도, 필터링 기능을 다양한 형태로 확장하여 일관성 있게 사용할 수 있습니다. 이를 통해 필터 조건을 유연하게 조합하거나 새로운 필터를 추가하기가 수월해집니다.
어댑터 패턴을 활용한 필터 모델 설명
어댑터 패턴은 호환되지 않는 인터페이스를 일관된 인터페이스로 변환하여 사용자가 같은 방식으로 다양한 객체를 활용할 수 있도록 해줍니다.
데이터 카드 모델: 필터링할 데이터 카드 리스트를 포함한 클래스입니다. 이를 통해 특정 조건에 맞는 필터 결과를 얻습니다.
필터 인터페이스(Filter Interface): 필터 조건을 정의한 기본 인터페이스입니다. 각 필터는 특정 조건을 만족하는 카드를 필터링하기 위해 이 인터페이스를 구현합니다.
구체적인 필터 클래스: 특정 조건을 구현하는 클래스입니다. 예를 들어,
ScoreFilter
는 점수 조건 필터링을,DateFilter
는 날짜 조건 필터링을 구현합니다.어댑터 클래스: 데이터 카드 모델의 필터 기능을 어댑터로 감싸어, 필터 인터페이스의 구현체를 통해 카드 리스트를 필터링하는 역할을 합니다.
이 구조를 사용하면 필터 조건을 새롭게 추가하거나 조합하여 사용할 수 있습니다.
예제 코드: 어댑터 패턴을 활용한 필터 모델 구현
from typing import List, Protocol
# 데이터 카드 필터 인터페이스 정의
class FilterInterface(Protocol):
def apply(self, data_card: dict) -> bool:
...
# 데이터 카드 모델 정의
class GamePlayDataCardModel(list):
def add_card(self, player_id, player_name, level, score, date):
card = {
"player_id": player_id,
"player_name": player_name,
"level": level,
"score": score,
"date": date
}
self.append(card)
# 구체적인 필터 클래스 정의
class ScoreFilter:
def __init__(self, min_score: int):
self.min_score = min_score
def apply(self, data_card: dict) -> bool:
return data_card["score"] >= self.min_score
class DateFilter:
def __init__(self, play_date: str):
self.play_date = play_date
def apply(self, data_card: dict) -> bool:
return data_card["date"] == self.play_date
class LevelRangeFilter:
def __init__(self, min_level: int, max_level: int):
self.min_level = min_level
self.max_level = max_level
def apply(self, data_card: dict) -> bool:
return self.min_level <= data_card["level"] <= self.max_level
# 필터 어댑터 클래스 정의
class FilterAdapter:
def __init__(self, data_model: GamePlayDataCardModel):
self.data_model = data_model
def filter(self, filters: List[FilterInterface]) -> List[dict]:
# 모든 필터 조건을 충족하는 카드만 필터링
return [
card for card in self.data_model
if all(f.apply(card) for f in filters)
]
# 데이터 카드 모델 인스턴스 생성
game_data = GamePlayDataCardModel()
# 데이터 카드 추가
game_data.add_card("player123", "GamerOne", level=5, score=1500, date="2024-10-21")
game_data.add_card("player456", "GamerTwo", level=3, score=1200, date="2024-10-21")
game_data.add_card("player123", "GamerOne", level=6, score=1800, date="2024-10-22")
game_data.add_card("player789", "GamerThree", level=4, score=900, date="2024-10-22")
# 어댑터를 통한 필터링
adapter = FilterAdapter(game_data)
# 필터 설정: 점수가 1300 이상이고, 날짜가 2024-10-21인 카드
filters = [ScoreFilter(min_score=1300), DateFilter(play_date="2024-10-21")]
filtered_cards = adapter.filter(filters)
print("Filtered Cards with score >= 1300 and date 2024-10-21:", filtered_cards)
# 다른 필터 조합: 레벨이 3에서 5 사이인 카드
filters = [LevelRangeFilter(min_level=3, max_level=5)]
filtered_cards = adapter.filter(filters)
print("Filtered Cards with level between 3 and 5:", filtered_cards)
출력 예시
Filtered Cards with score >= 1300 and date 2024-10-21: [
{'player_id': 'player123', 'player_name': 'GamerOne', 'level': 5, 'score': 1500, 'date': '2024-10-21'}
]
Filtered Cards with level between 3 and 5: [
{'player_id': 'player456', 'player_name': 'GamerTwo', 'level': 3, 'score': 1200, 'date': '2024-10-21'},
{'player_id': 'player789', 'player_name': 'GamerThree', 'level': 4, 'score': 900, 'date': '2024-10-22'}
]
코드 설명
FilterInterface
: 필터 조건을 정의한 프로토콜로, 필터 클래스는apply
메서드를 구현하여 조건에 맞는지 여부를 판별합니다.- 구체적인 필터 클래스:
ScoreFilter
,DateFilter
,LevelRangeFilter
는 각각 점수, 날짜, 레벨 범위를 기준으로 필터링합니다. FilterAdapter
클래스: 필터 어댑터가 데이터 모델을 감싸고, 여러 필터 조건을 적용하여 데이터 카드를 필터링하는 역할을 합니다.filter
메서드는 전달받은 필터 리스트를 모두 적용해 모든 조건을 만족하는 카드만 반환합니다.
이 구조의 장점
- 유연한 필터링 조건 추가: 필터를 클래스로 정의하고 어댑터를 통해 관리하므로, 새로운 필터 조건을 쉽게 추가할 수 있습니다.
- 조합 가능성: 여러 필터 조건을 동시에 사용할 수 있어 복잡한 필터링 조건도 적용할 수 있습니다.
- 확장성: 필터 인터페이스만 구현하면 새로운 필터를 쉽게 적용할 수 있어 구조 확장이 용이합니다.
어댑터 디자인 패턴을 통해 필터 조건을 일관되게 적용할 수 있으며, 필터링 조건 추가와 조합이 용이해 다양한 데이터 관리와 분석에 활용할 수 있습니다.
'데이터 카드 자료구조' 카테고리의 다른 글
[데이터 카드 자료구조] 리스트 상속 데이터 카드 자료구조 2 (1) | 2024.10.29 |
---|---|
[데이터 카드 자료구조] 데이터 카드 자료구조의 필터 기능 3 (0) | 2024.10.29 |
[데이터 카드 자료구조] 데이터 카드 자료구조의 필터 기능 1 (0) | 2024.10.29 |
[데이터 카드 자료구조] 리스트 상속 데이터 카드 자료구조 1 (1) | 2024.10.29 |
[데이터 카드 자료구조] 게임 플레이 데이터 저장 자료구조 1 (4) | 2024.10.26 |