Tôi đang tham gia một lớp mẫu thiết kế ở trường, và đã đọc qua một số chương của Head First Design Patterns. Những gì tôi muốn tìm hiểu là ở mức độ nào mà các mẫu thiết kế có thể ngăn chặn việc viết lại mã hiện có.Bạn có thể ngăn chặn việc sửa đổi mã hiện tại khi sử dụng các mẫu thiết kế ở mức độ nào?
Hãy để chúng tôi chụp Duck
lớp học và FlyBehavior
các lớp học chẳng hạn. Tôi có trong public static void main(String[] args)
đoạn mã sau:
Duck mallard = new MallardDuck(new FlyWithWings());
Am Tôi đúng khi nói rằng nó là không thể tránh khỏi rằng bạn sẽ phải thay đổi phương pháp main()
của bạn khi bạn muốn thêm một chiến lược mới? Bằng cách đó, bạn là sửa đổi mã hiện tại, phải không? Tôi đặc biệt đề cập đến một phần, nơi một lớp chiến lược cụ thể được đề cập: new FlyWithWings().
Nếu bạn thực hiện phương pháp mô hình nhà máy trong mã của bạn, bạn có thể ngăn chặn việc có một lớp bê tông (FlyWithWings
) khỏi bị nêu tại tất cả:
public FlyBehavior returnBehavior(FlyBehaviorFactory factory, String behaviorType) {
return factory.getFlyBehavior(behaviorType);
}
Và do đó, có dòng mã sau đây:
Duck mallard = new MallardDuck(returnBehavior(flyFactory, "wings"));
Bằng cách này, một phần nào đó của chương trình của bạn không nhất thiết phải biết về những gì FlyBehaviorFactory để sử dụng. Tuy nhiên, phương thức main()
của bạn sẽ vẫn phải chỉ định một số tham số nhất định trong phương thức returnBehavior để biết nhà máy sẽ tạo chiến lược gì. Vì vậy, tôi có quyền nói rằng bạn vẫn sẽ phải sửa đổi main()
nếu tôi đã thêm một lớp FlyBehavior mới và muốn thêm thông số đó làm tham số cho returnBehavior()
?
Có thể cải thiện tình huống này thêm nữa không?
Bạn nên xem [_dependency injection_] (http://en.wikipedia.org/wiki/Dependency_injection) và các khung công tác khác nhau cho nó. – Seelenvirtuose
@Synchro Vui lòng đọc: [Tôi nên làm gì khi ai đó trả lời câu hỏi của tôi] (http://stackoverflow.com/help/someone-answers) – CKing