Giới thiệu về mẫu thiết kế
Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 45 trên 65.
Mẫu thiết kế là cách sắp xếp các lớp đã được biết đến và đặt tên để giải quyết một vấn đề lặp lại trong nhiều chương trình. Mẫu thiết kế không phải là thư viện hay đoạn code để sao chép: nó mô tả những đối tượng nào tồn tại, mỗi đối tượng chịu trách nhiệm về điều gì và chúng phối hợp với nhau ra sao. Bạn tự viết code theo cách phù hợp với trò chơi của mình.
Các mẫu thiết kế cũng giúp nhà phát triển có cách gọi chung. “Kẻ địch xuất hiện từ một nhà máy” hoặc “thanh máu quan sát người chơi” giúp đồng đội hiểu cách tổ chức code trước khi mở tệp.
Đây là vấn đề mà một mẫu giải quyết. Bắt đầu một màn chơi nghĩa là phải giao tiếp với ba đối tượng, và mọi tập lệnh bắt đầu màn chơi đều lặp lại các dòng sau:
var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()
music.play("forest.ogg")
level_map.load_map(1)
hud.show_hearts(3)Mẫu Facade đặt một lớp trước các đối tượng đó và cung cấp cho lớp này một phương thức đơn giản:
# game_facade.gd
class_name GameFacade
extends RefCounted
var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()
func start_level(number: int) -> void:
music.play("forest.ogg")
level_map.load_map(number)
hud.show_hearts(3)# main.gd
var game := GameFacade.new()
game.start_level(1)Music: playing forest.ogg
Map: level 1 loaded
HUD: hearts 3Phần còn lại của chương trình gọi start_level(), và khi cách bắt đầu một màn chơi thay đổi, bạn chỉ cần chỉnh sửa một tệp.
Các mẫu được nhóm theo vấn đề mà chúng giải quyết:
- Mẫu khởi tạo kiểm soát cách tạo đối tượng: Singleton, Factory.
- Mẫu cấu trúc kết hợp các đối tượng thành cấu trúc lớn hơn: Facade, Adapter, Decorator, Composite.
- Mẫu hành vi tổ chức cách các đối tượng phối hợp với nhau: Observer, Strategy, Command, Template Method, State.
Chương này và chương tiếp theo trình bày các mẫu thiết kế sau. Mỗi mẫu được xây dựng dựa trên những gì bạn đã biết: lớp trong các tệp riêng, kế thừa, tính đa hình, tính hợp thành và tín hiệu.
Thử thách
DễTrò chơi bắt đầu và thoát khỏi các màn chơi thông qua ba đối tượng đã được viết sẵn: MusicPlayer (music_player.gd), LevelMap (level_map.gd) và Hud (hud.gd). Hãy viết lớp facade GameFacade để làm lớp trung gian cho chúng:
- Lớp này tạo một
MusicPlayer, mộtLevelMapvà mộtHudtrong các biến thành viên. start_level(number, hearts)phát bản nhạclevel_N.ogg(N là số màn chơi), hoặcboss.oggkhi số đó là bội số của5, sau đó tải bản đồ của màn chơi đó, rồi hiển thị số trái tim.quit_level()ẩn HUD, sau đó dừng nhạc.
Code được cung cấp sẽ đọc số lượng lệnh tiếp theo, rồi đọc mỗi lệnh trên một dòng: start NUMBER HEARTS hoặc quit. Với start 5 2 và quit, đầu ra là:
Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stoppedHãy viết code trong game_facade.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
extends Node
func _ready():
# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
var game := GameFacade.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "start":
game.start_level(int(parts[1]), int(parts[2]))
elif parts[0] == "quit":
game.quit_level()
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa selfPhương thứcThuộc tínhHàm khởi tạo (_init)Ôn tập: máy tính đơn giản4Tính đa hình
Xem lại cách ghi đè phương thứcĐịnh kiểu vịtLớp và phương thức trừu tượngThiết kế interfaceÔn tập: máy tính hình học7Tín hiệu
Tín hiệu là gì?Khai báo và phát tín hiệuKết nối với tín hiệuTín hiệu có đối sốÔn tập: hệ thống sức khỏe10Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổng hợp2Thuộc tính của lớp
Biến instance và biến staticHàm staticPhương thức thiết lập thuộc tínhPhương thức lấy thuộc tínhQuy ước về tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng5Tính đóng gói
Thành viên công khai và riêng tưXác thực bằng phương thức setterẨn thông tinThuộc tính chỉ đọcÔn tập: hệ thống hồ sơ học sinh8Khái niệm OOP nâng cao
Kết hợp và kế thừaLớp bên trongNode dưới dạng thành phầnRefCounted và NodeEnum trong lớpTự luyện tập: Trình biên dịch GDScript online