정의
는 클라이언트의 요청을 객체로 전달하므로 다양한 요청으로 클라이언트를 매개변수화할 수 있습니다. 변경 사항에 적응하기 위해 "동작 요청자"와 "동작 구현자"를 분리하여 둘 사이의 느슨한 결합을 달성하는 데 사용됩니다. 변화하는 요소와 일정한 요소를 분리합니다.
역할
명령
명령의 인터페이스를 정의하고 실행 방법을 선언합니다.
ConcreteCommand
명령 인터페이스 구현 객체는 "가상" 구현입니다. 일반적으로 수신기를 보유하고 수신기의 함수를 호출하여 명령에 의해 수행되는 작업을 완료합니다.
수신자
수신자, 실제로 명령을 실행하는 개체입니다. 명령에 필요한 해당 기능을 구현할 수 있는 한 모든 클래스는 수신자가 될 수 있습니다.
Invoker
는 요청을 실행하기 위해 명령 개체가 필요합니다. 일반적으로 명령 개체를 보유하고 있으며 많은 명령 개체를 보유할 수 있습니다. 이는 클라이언트가 실제로 명령을 트리거하고 해당 작업을 수행하기 위해 명령이 필요한 곳입니다. 이는 명령 개체에 들어가는 것과 같습니다.
클라이언트
특정 명령 개체를 생성하고 명령 개체의 수신자를 설정합니다. 이는 일반적인 의미의 클라이언트가 아니라 명령 개체와 수신자를 조립하는 것입니다. 실제로 명령을 사용하는 클라이언트가 호출자에서 실행을 트리거하기 때문에 이 클라이언트를 어셈블러라고 부르는 것이 더 나을 것입니다.
장점
1. 객체 간의 결합을 줄입니다.
2. 새로운 명령을 시스템에 쉽게 추가할 수 있습니다.
3. 조합 명령을 디자인하는 것이 더 쉽습니다.
4. 동일한 메소드를 호출하여 다른 기능 구현
단점
명령 모드를 사용하면 일부 시스템에서 특정 명령 클래스가 너무 많아질 수 있습니다. 각 명령에 대해 특정 명령 클래스를 설계해야 하기 때문에 일부 시스템에는 많은 수의 특정 명령 클래스가 필요할 수 있으며 이는 명령 패턴 사용에 영향을 미칩니다.
적용 가능한 상황
1. 시스템은 호출자와 수신자가 직접 상호 작용하지 않도록 요청 호출자와 요청 수신자를 분리해야 합니다.
2. 시스템은 요청을 지정하고, 요청을 대기열에 추가하고, 요청을 다른 시간에 실행해야 합니다.
3. 명령의 실행 취소(Undo) 작업과 복구(Redo) 작업을 지원하는 시스템이 필요합니다.
4. 시스템은 작업 그룹을 결합해야 합니다. 즉, 매크로 명령을 지원해야 합니다.
애플리케이션
은 켜기, 끄기, 채널 변경 명령을 사용하여 TV 작동을 시뮬레이션합니다. 코드는 다음과 같습니다
//执行命令的接口 public interface Command { void execute(); } //命令接收者Receiver public class Tv { public int currentChannel = 0; public void turnOn() { System.out.println("The televisino is on."); } public void turnOff() { System.out.println("The television is off."); } public void changeChannel(int channel) { this.currentChannel = channel; System.out.println("Now TV channel is " + channel); } } //开机命令ConcreteCommand public class CommandOn implements Command { private Tv myTv; public CommandOn(Tv tv) { myTv = tv; } public void execute() { myTv.turnOn(); } } //关机命令ConcreteCommand public class CommandOff implements Command { private Tv myTv; public CommandOff(Tv tv) { myTv = tv; } public void execute() { myTv.turnOff(); } } //频道切换命令ConcreteCommand public class CommandChange implements Command { private Tv myTv; private int channel; public CommandChange(Tv tv, int channel) { myTv = tv; this.channel = channel; } public void execute() { myTv.changeChannel(channel); } } //可以看作是遥控器Invoker public class Control { private Command onCommand, offCommand, changeChannel; public Control(Command on, Command off, Command channel) { onCommand = on; offCommand = off; changeChannel = channel; } public void turnOn() { onCommand.execute(); } public void turnOff() { offCommand.execute(); } public void changeChannel() { changeChannel.execute(); } } //测试类Client public class Client { public static void main(String[] args) { // 命令接收者Receiver Tv myTv = new Tv(); // 开机命令ConcreteCommond CommandOn on = new CommandOn(myTv); // 关机命令ConcreteCommond CommandOff off = new CommandOff(myTv); // 频道切换命令ConcreteCommond CommandChange channel = new CommandChange(myTv, 2); // 命令控制对象Invoker Control control = new Control(on, off, channel); // 开机 control.turnOn(); // 切换频道 control.changeChannel(); // 关机 control.turnOff(); } }
실행 결과
텔레비시노가 켜져 있습니다.
지금 TV 채널은 2입니다
텔레비전이 꺼져 있습니다.
요약
1. 명령 패턴의 핵심은 명령을 캡슐화하여 명령을 내리는 책임과 명령을 실행하는 책임을 분리하는 것입니다.
2. 각 명령은 작업입니다. 요청하는 쪽에서는 작업을 수행하라는 요청을 보내고, 받는 쪽에서는 요청을 받아 작업을 수행합니다.
3. 명령 모드를 사용하면 요청 당사자와 수신 당사자가 독립적일 수 있으므로 요청 당사자는 요청 수신 방법은 물론이고 요청을 받는 당사자의 인터페이스도 알 필요가 없습니다. 작업이 실행되는지 여부 및 실행 방법.
4. 명령 모드는 요청 자체를 객체로 만들어 다른 객체처럼 저장하고 전송할 수 있습니다.
5. 명령 모드의 핵심은 추상 명령 인터페이스를 도입하는 것이며, 추상 명령 인터페이스를 위한 송신 프로그램만 수신자와 연관될 수 있습니다.