2016-10-13 3 views
1

모르는 사이에 클라이언트 &이 동일한 클라이언트에서 명령 패턴을 사용하고 있으며 명령을 직접 호출했습니다. DoFactory에 정의를보고 난 후에, 나는 약간 혼란 스럽다.C# 명령 패턴 혼동

개별 명령이 있습니다. 그것은 내 순진한 이해에서 변하지 않았습니다. 나는 호출자가 단순히 모든 명령을 호출한다고 생각합니다. 그러나 수신기의 목적은 무엇입니까? 내가 얻지 못하는 것.

가능한 경우 누군가가 여러 명령과 구현 방법에 대한 예제를 제공 할 수 있습니까?

+1

? 개별 명령 처리기 또는 ...? – kayess

+0

개별 명령이 있습니다. 그것들은 개별 과제입니다. 나는 어떻게 '수신기'가 그림에 잘 들어 맞는지 모르겠습니다. – Skadoosh

+0

이전에 언급 한 내용에 따르면 명령 처리자 (귀하의 말로 표현 된 리시버)가 어떻게 작동하는지 알 수 없습니까? 또는 명령 처리기가 제기 한 이벤트를 참조하고 있습니까? – kayess

답변

0

이 패턴에 Receiver이 참여하는 것이 중요하지 않다는 것은 매우 단순한 Command 인터페이스 뒤에 숨겨진 구체적인 명령 객체가 중요한 작업을 수행 할 수 있다는 것을 강조하는 것입니다. 심지어 그 객체가 실제로 다른 객체에 의해 처리된다는 사실을 강조하는 것입니다. (Receiver) 명령 객체 자체가 아닙니다.

실제로 명령 패턴의 요점은 하나 이상의 작업을 쉽게 저장하고 전달할 수 있도록 복잡한 작업을 최소한의 인터페이스 (아무런 매개 변수도 필요없는 void 메서드 - void execute() -)로 캡슐화하는 것입니다. 나중에 Invoker을 호출 할 수 있습니다. Command 인터페이스가 최소이기 때문에 이것은 Invoker에 매우 편리합니다.

Command의 명확한 예제는 Java의 잘 알려진 Runnable 인터페이스입니다.

+0

수신기가 다른 시스템과 통신하도록 설정할 수 있다고 생각했습니다. 예를 들어 새로운 사용자 계정을 만들어야하지만 새 사용자를 만들려면 두 시스템과 통신해야합니다. 이 경우 두 개의 명령이 작성됩니다. 하나는 system1과 통신하고 다른 하나는 system2와 통신합니다. 두 개의 수신자도 작성됩니다 (하나는 command1 용이고 다른 하나는 command2 용). 이제 클라이언트에서 두 명령을 호출하면 적절한 시스템에 연결하여 작업을 수행하는 방법을 알 수 있습니다. 나는 이것을 정확하게 생각하고 있는가? – Skadoosh

+0

예, 맞습니다. 이 방법으로 원하는 경우 두 명령을 작성한 후 실행을 연기하거나 어딘가에 전달하거나 적당한 시점에 어딘가에 명령을 실행하면 새 사용자가 만들어집니다. – Kata

1

기본 의도는 Command 패턴은 실제 소비자 (CommandHandler)에서 일부 클래스 (구체적인 명령 클래스)의 기본 (가장 중요한) 작업을 분리합니다.

그래서 우리는 다형성을 기반으로 한 작업을하고 있습니다. void excecute(){}이라는 메서드가있는 클래스의 클래스를 정의하므로 메서드 매개 변수 나 반환 형식에 강하지는 않습니다. 그래서 구체적인 Command 클래스는 그 메소드 내에서 클래스 특정 구현을 구현할 수 있으며, CommandHandler는 정확하게 그 concrete 클래스가 (Command 클래스의 인스턴스이면 충분 함) 알 필요없이 someCommandObject.execute();을 자유롭게 호출 할 수 있습니다. 따라서 호출과 구현은 거의 분리되어 있습니다. 나중에 void execute(){}을 구현하는 또 다른 구체적인 Command 클래스를 소개 할 수 있습니다. CommandHandler는 someCommandObject.execute();을 호출하여이를 호출 할 수 있습니다. 그것이 커맨드 패턴의 아름다움입니다.

자바 스레드에서는 Thread.run()이고 C# 스레드에서는 Task.Run()과 똑같은 내용입니다.

고객님의 편의에 따라 수신기을 사용할 수 있지만 Command 패턴의 큰 그림에서 조금 벗어났습니다. 귀하의 계산기 예제에서, 수신자을 가지고있는 것이 합당합니다. 왜냐하면 모든 concrete Command 클래스가 기본 조작 (execute())을 실행하기 위해이를 참조 할 수 있기 때문입니다.

수신자가 사용되지 않은 herethere에서 몇 가지 예를 볼 수 있습니다. 그것은 합리적인 곳에 수신기를 사용하는 것 이상으로 완벽합니다. 그러나 커맨드 패턴의 실제 거래로 그 것을 혼동하지 마십시오.:))

+0

좋은 직장 +1! 나는 CQS를 처음 생각했다 ... :) – kayess

+1

@kayess는 정말로 당신의 열린 마음을 고맙게 생각한다 :)) –

0

C#에서 명령 디자인 패턴의 간단한 예 : 당신에게 정확히 불분명 무엇

using System; 

interface ICommand { 
    void Execute(); 
} 

class Rifle : ICommand 
{ 
    public void Execute() 
    { 
     Console.WriteLine("Rifle is in action : Pif! Paf!"); 
    } 
} 

class Cannon : ICommand 
{ 
    public void Execute() 
    { 
     Console.WriteLine("Cannon is in action : Bum! Bam!"); 
    } 
} 

class Invoker 
{ 
    private ICommand _command; 
    public void SetCommand(ICommand command) 
    { 
     this._command = command; 
    } 

    public void Action() 
    { 
     _command.Execute(); 
    } 
} 

class Client 
{ 
    static void Main() 
    { 

     ICommand command0 = new Rifle(); 
     ICommand command1 = new Cannon(); 

     /////////////////////////////// 
     Invoker invoker = new Invoker(); 

     invoker.SetCommand(command0); 
     invoker.Action(); 

     invoker.SetCommand(command1); 
     invoker.Action(); 

     Console.ReadKey(); 
    } 
} 
/*output : 
Rifle is in action : Pif! Paf! 
Cannon is in action : Bum! Bam! 
*/