Menu
CoddyTech

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 3

Phầ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.

challenge icon

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ột LevelMap và một Hud trong các biến thành viên.
  • start_level(number, hearts) phát bản nhạc level_N.ogg (N là số màn chơi), hoặc boss.ogg khi số đó là bội số của 5, 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: stopped

Hã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()
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch GDScript online