Xin chào tất cả các thành viên diễn đàn!
Tôi (có vẻ như đối với tôi) đã tìm ra kỹ lưỡng mô hình đó
Command
và tôi muốn thử nói về nó “bằng lời nói của mình”.
Dựa trên Wikipedia, chúng ta có thể thấy rằng mục đích của nó là
tạo ra một cấu trúc trong đó lớp gửi và lớp nhận không phụ thuộc trực tiếp vào nhau. Tổ chức một cuộc gọi lại đến một lớp bao gồm lớp người gửi . Về nguyên tắc, nó được viết rõ ràng và chính xác, nhưng đây chỉ là lý thuyết. làm như thế nào? Đây chính là lúc vấn đề bắt đầu, bởi vì... mô tả không còn rõ ràng và rõ ràng nữa. Vì vậy, tôi đã tìm ra, tôi quyết định nói cho bạn biết tôi hiểu nó như thế nào, có thể nó sẽ hữu ích cho ai đó: Dựa trên mô tả mục đích của mẫu này, tôi sẽ kết hợp mô tả với mã để làm cho nó rõ ràng hơn, bởi vì trong cùng một Wikipedia, họ đã khái quát nó cho nhiều ngôn ngữ và do đó phần mô tả được tách ra khỏi ví dụ. Có bốn thuật ngữ trong mẫu này, bây giờ chúng ta hãy coi chúng là đương nhiên: lệnh(
command
), bộ nhận lệnh(
receiver
), trình gọi lệnh(
invoker
) và máy khách(
client
). Tôi sẽ lấy một ví dụ từ cùng một Wikipedia, nó khá có thể chấp nhận được.
Nhiệm vụ là một lớp
Light
có thể làm hai việc: bật đèn và tắt đèn. Về mặt mẫu, nó sẽ là “bộ nhận lệnh (
receiver
)”
public class Light{
public Light(){ }
public void turnOn(){
System.out.println("The light is on");
}
public void turnOff(){
System.out.println("The light is off");
}
}
Hãy tạo một giao diện với một phương thức
execute()
sẽ thực thi và được gọi theo mẫu "lệnh (
command
)"
public interface Command{
void execute();
}
Cần phải gói gọn việc thực hiện các kỹ năng của lớp
Light
. Để làm điều này, chúng ta sẽ tạo các lớp
TurnOnLightCommand
và
TurnOffLightCommand
triển khai giao diện
Command
cũng như chấp nhận một đối tượng lớp trong hàm tạo
Light
. Và mỗi người trong số họ sẽ chỉ thực hiện một hành động. Một người sẽ gọi phương thức này
turnOn()
và người kia sẽ gọi
turnOff()
.
public class TurnOnLightCommand implements Command{
private Light theLight;
public TurnOnLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOn();
}
}
public class TurnOffLightCommand implements Command{
private Light theLight;
public TurnOffLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOff();
}
}
Bây giờ là lúc tạo một đối tượng chấp nhận các phương thức đối tượng được đóng gói này
Light
. Về mặt mẫu, nó được gọi là trình gọi lệnh (invoker). Hãy gọi nó
Switch
và để nó chấp nhận các biến trong hàm tạo
Command
sẽ được sử dụng trong các phương thức đã tạo
flipUp()
và
flipDown()
.
public class Switch {
private Command flipUpCommand;
private Command flipDownCommand;
public Switch(Command flipUpCommand,Command flipDownCommand){
this.flipUpCommand=flipUpCommand;
this.flipDownCommand=flipDownCommand;
}
public void flipUp(){
flipUpCommand.execute();
}
public void flipDown(){
flipDownCommand.execute();
}
}
Và tất nhiên, chúng ta sẽ tạo một lớp sẽ sử dụng chúng để hiểu những gì đang diễn ra nói chung. Nó sẽ được gọi là phương thức chính, trong đó tất cả hành động sẽ diễn ra:
public class TestCommand{
public static void main(String[] args){
Light l=new Light();
Command switchUp=new TurnOnLightCommand(l);
Command switchDown=new TurnOffLightCommand(l);
Switch s=new Switch(switchUp,switchDown);
s.flipUp();
s.flipDown();
}
}
Đầu ra sẽ như sau:
"The light is on"
"The light is off"
Điều này được áp dụng ở đâu?
Mục đích là rõ ràng điều gì và tại sao điều này lại cần thiết, cụ thể là: trong tình huống bạn cần tách riêng một thực thi cụ thể, điều này rất thuận tiện. Vì vậy, việc sử dụng một số chức năng không phụ thuộc vào việc triển khai cụ thể và nó có thể được thay đổi mà không làm hỏng hệ thống. đại loại như thế này...) Viết nhận xét của bạn, cùng thảo luận, biết đâu cái gì đó có thể đơn giản hơn và kể hay hơn, chúng tôi sẽ chỉnh sửa mọi thứ nếu cần) Để những ai mới đọc lần đầu sẽ hiểu rõ nhất có thể. Chà, ai thích bài viết thì đánh dấu “+” vào đó :) Điều này quan trọng đối với tôi) Theo thời gian, tôi muốn viết nhiều hơn về
Builder
,
Singleton
và những người khác.
Xem thêm các bài viết khác của tôi:
GO TO FULL VERSION