JavaRush /Java Blog /Random-KO /자신의 말로 표현된 명령 패턴
Roman_kh
레벨 33
Харьков

자신의 말로 표현된 명령 패턴

Random-KO 그룹에 게시되었습니다

안녕하세요, 포럼 회원 여러분!

나는 그 패턴을 (내 생각에는) 철저하게 파악했고 Command그것에 대해 "나의 말로" 이야기하려고 합니다. Wikipedia에 따르면 송신 클래스와 수신 클래스가 서로 직접적으로 의존하지 않는 구조를 만드는 것이자신의 말로 표현하는 명령 패턴 - 1 목적임을 알 수 있습니다 . sender 클래스를 포함하는 클래스로 콜백을 구성합니다 . 원칙적으로는 명확하고 정확하게 작성되었지만 이는 이론상입니다. 어떻게 해야 하나요? 여기서부터 문제가 시작됩니다. 왜냐하면... 설명이 더 이상 명확하고 명확하지 않습니다. 그래서 나는 그것을 알아냈고, 내가 어떻게 이해했는지 말해 주기로 결정했습니다. 아마도 누군가에게 도움이 될 것입니다. 이 패턴의 목적에 대한 설명을 바탕으로 설명과 코드를 결합하여 더 명확하게 하겠습니다. 왜냐하면 동일한 Wikipedia에서는 이를 여러 언어에 대해 일반화했기 때문에 설명은 예제와 분리되어 있습니다. command이 패턴에는 명령( ), 명령 수신자( receiver), 명령 호출자( invoker) 및 클라이언트( ) 라는 네 가지 용어가 있습니다. 지금은 이를 당연한 것으로 간주하겠습니다 client. 동일한 Wikipedia에서 예를 들어 보겠습니다. 꽤 견딜 수 있습니다. 과제는Light 불을 켜고 끄는 두 가지 일을 할 수 있는 클래스입니다 . 패턴상으로는 “명령수신자( receiver)” 가 됩니다.
/*Receiver class*/

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");
     }
}
"command ( )" 패턴 execute()으로 실행되고 호출되는 하나의 메서드로 인터페이스를 만들어 보겠습니다.command
/*the Command interface*/

public interface Command{
    void execute();
}
클래스 스킬의 실행을 캡슐화하는 것이 필요합니다 Light. 이를 위해 인터페이스를 구현 TurnOnLightCommand하고 생성자에서 클래스 객체를 허용하는 클래스를 생성합니다 . 그리고 그들 각각은 단 하나의 작업만 수행합니다. 하나는 메소드를 호출 하고 다른 하나는 를 호출합니다 . TurnOffLightCommandCommandLightturnOn()turnOff()
/*the Command for turning on the light*/

public class TurnOnLightCommand implements Command{
   private Light theLight;

   public TurnOnLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOn();
   }
}

/*the Command for turning off the light*/

public class TurnOffLightCommand implements Command{
   private Light theLight;

   public TurnOffLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOff();
   }
}
이제 이러한 캡슐화된 객체 메서드를 허용하는 객체를 생성할 차례입니다 Light. 패턴으로는 명령어 호출자(Invoker)라고 합니다. 이를 호출 하고 생성된 메서드 및 에서 사용될 Switch생성자의 변수를 허용하도록 하겠습니다 . CommandflipUp()flipDown()
/*the Invoker class*/

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();
    }
}
물론, 일반적인 상황을 이해하기 위해 이를 사용하는 클래스도 만들 것입니다. 모든 작업이 수행되는 기본 메서드라고 합니다.
/*The test class*/
public class TestCommand{
   public static void main(String[] args){
       // создаем an object, который будет использоваться
       Light l=new Light();
       // создаем an objectы для всех умений an object Light:
       Command switchUp=new TurnOnLightCommand(l);
       Command switchDown=new TurnOffLightCommand(l);

       // Создаемтся invoker, с которым мы будем непосредственно контактировать:
       Switch s=new Switch(switchUp,switchDown);

       // вот проверка этого, используем методы:
       s.flipUp();
       s.flipDown();
   }
}
출력은 다음과 같습니다.
"The light is on"
"The light is off"

이것은 어디에 적용되나요?

이것이 필요한 이유와 목적은 명확합니다. 즉, 특정 실행을 분리해야 하는 상황에서는 매우 편리합니다. 따라서 일부 기능의 사용은 특정 구현에 의존하지 않으며 시스템을 손상시키지 않고 변경할 수 있습니다. 이런 것...) 의견을 작성하고 토론합시다. 아마도 뭔가를 더 간단하게 만들고 더 잘 말할 수 있을 것입니다. 필요한 경우 모든 것을 편집하겠습니다.) 처음 읽는 사람들을 위해 최대한 명확하게 설명합니다. Builder글쎄, 기사를 좋아하는 사람은 기사에 "+"를 붙입니다. :) 이것은 나에게 중요합니다.) 시간이 지남에 따라 , Singleton및 기타에 대해 더 많이 쓰고 싶습니다 . 내 다른 기사도 참조하십시오.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION