Khi tôi lập trình bằng Java (hoặc một ngôn ngữ tương tự), tôi thường sử dụng một phiên bản đơn giản của mẫu Chiến lược, sử dụng các giao diện và các lớp triển khai để cung cấp các triển khai có thể lựa chọn theo thời gian của một khái niệm cụ thể trong mã của tôi.Thay thế tốt hơn cho mô hình Chiến lược trong Scala?
Là một ví dụ rất giả tạo, tôi có thể muốn có khái niệm chung về một Động vật có thể tạo ra tiếng ồn trong mã Java của tôi và muốn có thể chọn loại động vật khi chạy. Vì vậy, tôi sẽ viết mã theo các dòng sau:
interface Animal {
void makeNoise();
}
class Cat extends Animal {
void makeNoise() { System.out.println("Meow"); }
}
class Dog extends Animal {
void makeNoise() { System.out.println("Woof"); }
}
class AnimalContainer {
Animal myAnimal;
AnimalContainer(String whichOne) {
if (whichOne.equals("Cat"))
myAnimal = new Cat();
else
myAnimal = new Dog();
}
void doAnimalStuff() {
...
// Time for the animal to make a noise
myAnimal.makeNoise();
...
}
Đủ đơn giản. Gần đây, mặc dù, tôi đã làm việc trên một dự án ở Scala và tôi muốn làm điều tương tự. Có vẻ như dễ dàng, đủ để làm điều này sử dụng những đặc điểm, với một cái gì đó như thế này:
trait Animal {
def makeNoise:Unit
}
class Cat extends Animal {
override def makeNoise:Unit = println("Meow")
}
class AnimalContainer {
val myAnimal:Animal = new Cat
...
}
Tuy nhiên, điều này dường như rất Java-thích và không phải là rất chức năng - không đề cập đến những đặc điểm và giao diện không thực sự sự điều tương tự. Vì vậy, tôi tự hỏi nếu có một cách thành ngữ hơn để thực hiện mô hình Chiến lược - hoặc một cái gì đó giống như nó - trong mã Scala của tôi để tôi có thể chọn thực hiện cụ thể một khái niệm trừu tượng khi chạy. Hoặc đang sử dụng những đặc điểm tốt nhất để đạt được điều này?
Cảm ơn, Daniel! Tôi đã chọn câu trả lời này vì nó thân thiện hơn với mã đã tồn tại (nhiều OO hơn là chức năng). Câu trả lời của @ VonC cũng tuyệt vời và tôi có thể sử dụng nó khi làm việc trong một chức năng hơn cơ sở mã. – MattK