1. 커맨드 패턴이란?
- 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴.
- 객체의 행위(메서드)를 클래스로 만들어 캡슐화하는 패턴.
- 요청을 요청에 대한 모든 정보가 포함된 독립실행형 객체로 변환하는 행동 패턴.
- 요청의 실행을 지연하거나 대기열에 넣을 수 있도록 하고, 또 실행 취소할 수 있는 작업도 지원한다.
- 요청을 객체의 형태로 캡슐화하여 나중에 이용할 수 있도록 메서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 해주는 패턴.
2. 커맨드 패턴을 사용하는 경우
- 요청이 서로 다른 사용자, 시간 또는 프로젝트에 따라 달라질 수 있을 경우
- 이벤트를 발생시키는 클래스를 변경하지 않고 재사용하고 싶은 경우
- 여러 커맨드를 조합하여 하나의 커맨드처럼 사용할 필요가 있는 경우
3. 커맨드 패턴의 장점
1) 재사용 : 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스를 변경하지 않고 재사용하고자 할 때 유용하다.
2) 확장성 및 유연성 : 실행될 기능을 캡슐화함으로써 기능의 실행을 요구하는 호출자 클래스, 실제 기능을 실행하는 수신자 클래스 사이의 의존성을 제거하므로 실행될 기능의 변경에도 호출자 클래스를 수정없이 그대로 사용할 수 있다.
3) 낮은 결합도 : 요청 발신자와 수신자 사이에 직접적인 연결이 없다.
4. 커맨드 패턴의 단점
- 각각의 개별 요청에 대해 Command 클래스를 만들어하므로, 클래스가 많아질 수 있다.
- 코드 복잡성이 증가할 수 있다.
5. 코드 구현
- 구성
1) Action - 인터페이스 또는 추상 클래스로 정의 후 상속하여 사용, 행위의 외형을 추상화
2) Command - 행위 명령을 실행
3) Reciever - 실제 행위를 정의
4) Invoker - 명령을 호출
- 실행 과정
Invoker -> 명령 호출 -> Command -> 명령 전달 -> Reciever -> 명령 수행
- 소스 코드(C#)
using System;
using System.Collections.Generic;
using System.Threading;
namespace StudyCSharp
{
// Action
public interface Command
{
void Execute();
}
// 커맨드(Command) 1
public class ExerciseStartCommand : Command
{
Exercise _exercise;
public ExerciseStartCommand(Exercise exercise)
{
this._exercise = exercise;
}
public void Execute()
{
_exercise.StartExercise();
}
}
// 커맨드(Command) 2
public class ExerciseEndCommand : Command
{
Exercise _exercise;
public ExerciseEndCommand(Exercise exercise)
{
this._exercise = exercise;
}
public void Execute()
{
_exercise.EndExercise();
}
}
// 수신자(Receiver)
public class Exercise
{
public void StartExercise()
{
Console.WriteLine("운동 시작");
}
public void EndExercise()
{
Console.WriteLine("운동 끝");
}
}
// 호출자(Invoker)
public class Gym
{
private Command _startCommand;
private Command _endCommand;
public void setCommand(Command command1, Command command2)
{
this._startCommand = command1;
this._endCommand = command2;
}
public void arrivedGym()
{
Console.WriteLine("헬스장 도착");
Console.WriteLine("-------------------");
_startCommand.Execute();
}
public void GoHome()
{
_endCommand.Execute();
Console.WriteLine("-------------------");
Console.WriteLine("집에 가자");
}
}
class Program
{
static void Main(string[] args)
{
// 인스턴스 생성
Exercise ex = new Exercise();
Command startCommand = new ExerciseStartCommand(ex);
Command endCommand = new ExerciseEndCommand(ex);
// 호출자 생성
Gym gym = new Gym();
// 커맨드 설정
gym.setCommand(startCommand, endCommand);
// 커맨드 사용
gym.arrivedGym();
Console.WriteLine();
Console.WriteLine("...운동중...");
Console.WriteLine();
gym.GoHome();
}
}
}
<참고 사이트>
커맨드 패턴 Command Pattern
이번에 소개할 패턴인 커맨드 패턴은 특정 기능을 캡슐화 시키는 패턴입니다. 1. 커맨드 패턴 소개 커맨드 패턴은 서론에서 이야기 했듯이 특정 기능들을 캡슐화 시키는 패턴입니다. 그래서 보
bamtory29.tistory.com
Command 패턴
Command 패턴은 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴입니다. 구조 Invoker 기능의 실행을 요청하는 호출자 클래스입니다. Rece
jhtop0419.tistory.com
[Design Pattern] 커맨드(Command) 패턴이란?
커맨트 패턴(Command pattern)은 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스를 변경하지 않고 재사용하고자 할 때 유용하다. 실행될 기능
leveloper.tistory.com
[Design Pattern] Command Pattern(커맨드 패턴)
Command Pattern이란? Command Pattern은 행동(behavioral) 디자인 패턴 중 하나로, 요청 자체를 객체화 하는 것을 목표로 합니다. 이 패턴은 요청이 서로 다른 사용자, 시간 또는 프로젝트에 따라 달라질 수
gsbang.tistory.com
[디자인패턴] 커맨드 패턴 ( Command Pattern )
커맨드 패턴( Command Pattern )커맨드 패턴은 객체의 행위( 메서드 )를 클래스로 만들어 캡슐화 하는 패턴입니다. 즉, 어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 그 객체(B)를 참조하고 있
victorydntmd.tistory.com
[Design Pattern] 커맨드 패턴이란 무엇인가?
커맨드 패턴 커멘드 패턴은 하나의 객체를 통해 여러 객체들에 명령(Command)을 해야 할 때 사용되는 패턴이다. 커멘드 패턴을 사용하면 요청을 캡슐화해서 커멘드 객체가 명령을 해야하는 객체들
kotlinworld.com
[디자인패턴] 커맨드패턴(Command Pattern)
커맨드패턴은 객체의 행위(메서드)를 클래스로 만들어 캡슐화하는 패턴이다.어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 객체(B)를 참조하고 있어야 하는 의존성이 발생한다. 이와 같
velog.io
[Design Pattern] 커맨드 패턴이란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
커맨드 패턴
/ 디자인 패턴들 / 행동 패턴 커맨드 패턴 다음 이름으로도 불립니다: 액션, 트랜잭션, Command 의도 커맨드는 요청을 요청에 대한 모든 정보가 포함된 독립실행형 객체로 변환하는 행동 디자인
refactoring.guru
커맨드 패턴 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 커맨드 패턴(Command pattern)이란 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보
ko.wikipedia.org
C# 디자인 패턴 - Command Pattern
https://scottlilly.com/c-design-patterns-the-command-pattern/ 위 블로그의 번역 요약 이 디자인 패턴은...
blog.naver.com