C\#디자인 모드 시리즈 튜 토리 얼-명령 모드
하나의 요청 을 하나의 대상(즉,우리 가 만 든 Command 대상)으로 밀봉 하여 서로 다른 요청 으로 고객 을 매개 변수 화 할 수 있 도록 합 니 다.요청 대기 열 이나 요청 로 그 를 기록 하고 취소 가능 한 동작 을 지원 합 니 다.
2.해결 하 는 문제
소프트웨어 시스템 에서 행위 요구 자 와 행위 실현 자 는 보통 긴밀 한 결합 관계 이지 만 어떤 경우 에는 행위 에 대해 기록,취소 또는 재 작업,사무 등 처 리 를 해 야 할 때 변 화 를 막 을 수 없 는 긴밀 한 결합 디자인 이 적합 하지 않다.
3.모드 에서 의 캐릭터
3.1 추상 명령(Command):명령 의 인 터 페 이 스 를 정의 하고 실행 방법 을 설명 합 니 다.
3.2 구체 적 인 명령(Concretecond):구체 적 인 명령,실행 할 방법 을 실현 하 는 것 은 보통'허'의 실현 이다.보통 수신 자가 있 고 수신 자의 기능 을 호출 하여 명령 이 실 행 될 동작 을 수행 합 니 다.
3.3 수신 자(Receiver):명령 을 진정 으로 수행 하 는 대상.모든 종 류 는 명령 이 요구 하 는 해당 기능 을 실현 할 수만 있다 면 수신 자가 될 수 있다.
3.4 호출 자(Invoker):명령 대상 에 게 요청 을 수행 하도록 요구 합 니 다.보통 명령 대상 을 가지 고 많은 명령 대상 을 가 질 수 있 습 니 다.이것 은 클 라 이언 트 가 진정 으로 명령 을 실행 하고 명령 을 실행 하도록 요구 하 는 곳 입 니 다.즉,명령 대상 을 사용 하 는 입구 에 해당 합 니 다.
3.5 클 라 이언 트(Client):명령 은 클 라 이언 트 가 만 들 고 명령 의 수신 자 를 설정 합 니 다.
4.패턴 판독
4.1 명령 모드 의 도표
4.2 명령 모드 의 실현 코드
/// <summary>
/// , , 。
/// </summary>
public class Receiver
{
/// <summary>
///
/// </summary>
public void Action()
{
Console.WriteLine("Execute request!");
}
}
/// <summary>
/// ,
/// </summary>
public interface ICommand
{
void Execute();
}
/// <summary>
/// , 。
/// </summary>
public class ConcereteCommand : ICommand
{
// ,
private Receiver receiver;
public ConcereteCommand(Receiver receiver)
{
this.receiver = receiver;
}
/// <summary>
/// “ ” , Execute
/// </summary>
public void Execute()
{
receiver.Action();
}
}
/// <summary>
/// ,
/// </summary>
public class Invoker
{
private ICommand command;
/// <summary>
///
/// </summary>
/// <param name="command"></param>
public void SetCommand(ICommand command)
{
this.command = command;
}
/// <summary>
///
/// </summary>
public void ExecuteCommand()
{
command.Execute();
}
}
4.3 클 라 이언 트 코드
class Program
{
static void Main(string[] args)
{
Receiver receiver = new Receiver();
ICommand command = new ConcereteCommand(receiver);
Invoker invoker = new Invoker();
invoker.SetCommand(command);
invoker.ExecuteCommand();
Console.Read();
}
}
실행 결과4.4 모델 분석
4.4.1 본질:명령 을 봉인 하고 명령 을 내 리 는 것 과 명령 을 집행 하 는 책임 을 분리 한다.
4.4.2 모든 명령 은 하나의 조작 이다.요청 한 측 이 요청 을 하고 하나의 조작 을 요구 하 는 것 이다.받 은 쪽 에서 요청 을 받 고 작업 을 수행 합 니 다.
4.4.3 요청 자 와 수신 자가 독립 되 어 요청 을 받 은 측 이 요청 을 받 은 측의 인 터 페 이 스 를 알 필요 가 없고 요청 이 어떻게 받 아들 여 졌 는 지,작업 이 실 행 됐 는 지,언제 실 행 됐 는 지,어떻게 실 행 됐 는 지 알 필요 가 없다.
4.4.4 요청 자 체 를 하나의 대상 으로 만 들 고 이 대상 은 다른 대상 과 마찬가지 로 저장 되 고 전 달 될 수 있다.
4.4.5 명령 모드 의 관건 은 추상 적 인 명령 인 터 페 이 스 를 도입 하고 발송 자가 추상 적 인 명령 인터페이스 에 대해 프로 그래 밍 을 하 는 것 이다.추상 적 인 명령 인터페이스의 구체 적 인 명령 을 실현 해야만 수신 자 와 관련 이 있다.
5.모델 총화
5.1 장점
5.1.1 요구 자 와 실현 자 간 의 결합 을 해제 하고 시스템 의 결합 도 를 낮 추 었 다.
5.1.2 요청 대기 열 이나 요청 로 그 를 기록 하고 취소 작업 을 지원 합 니 다.
5.1.3 조합 명령 을 쉽게 설계 할 수 있다.
5.1.4 새로운 명령 은 시스템 에 쉽게 가입 할 수 있다.
5.2 단점
5.2.1 모든 명령 에 대해 구체 적 인 명령 류 를 설계 해 야 하기 때문에 명령 모드 를 사용 하면 시스템 에 구체 적 인 명령 류 가 너무 많 을 수 있 습 니 다.
5.3 필드 적용
5.3.1 행위 에 대한'기록,취소/재 작업'등 처리 가 필요 할 때.
5.3.2 시스템 은 요청 자 와 수신 자 를 결합 시 켜 호출 자 와 수신 자가 직접적 으로 상호작용 하지 않도록 해 야 한다.
5.3.3 시스템 은 서로 다른 시간 에 요청,대기 요청 과 실행 요청 을 지정 해 야 한다.
5.3.4 시스템 은 매크로 명령 을 지원 하 는 일련의 조작 을 조합 해 야 한다.
6.예 를 들 어 은행 계좌 의 예금,인출
6.1 분류 도
6.2 코드 구현
/// <summary>
///
/// </summary>
public class Account
{
/// <summary>
///
/// </summary>
private decimal totalAmount { get; set; }
/// <summary>
///
/// </summary>
/// <param name="amount"></param>
public void MoneyIn(decimal amount)
{
this.totalAmount += amount;
}
/// <summary>
///
/// </summary>
/// <param name="amount"></param>
public void MoneyOut(decimal amount)
{
this.totalAmount -= amount;
}
public decimal GetTotalAmout()
{
return totalAmount;
}
}
public abstract class Command
{
protected Account account;
public Command(Account account)
{
this.account = account;
}
public abstract void Execute();
}
/// <summary>
///
/// </summary>
public class MoneyInCommand : Command
{
private decimal amount;
public MoneyInCommand(Account account, decimal amount)
: base(account)
{
this.amount = amount;
}
/// <summary>
///
/// </summary>
public override void Execute()
{
account.MoneyIn(amount);
}
}
/// <summary>
///
/// </summary>
public class MoneyOutCommand : Command
{
private decimal amount;
public MoneyOutCommand(Account account, decimal amount)
: base(account)
{
this.amount = amount;
}
/// <summary>
///
/// </summary>
public override void Execute()
{
account.MoneyOut(amount);
}
}
public class Invoker
{
private Command command;
public void SetCommand(Command command)
{
this.command = command;
}
public void ExecuteCommand()
{
command.Execute();
}
}
6.3 클 라 이언 트 코드
class Program
{
static void Main(string[] args)
{
//
Account account = new Account();
// 500
Command commandIn = new MoneyInCommand(account,500);
//
BankAccount.Invoker invoker = new BankAccount.Invoker();
//
invoker.SetCommand(commandIn);
//
invoker.ExecuteCommand();
Console.WriteLine("The current amount is " + account.GetTotalAmout().ToString("N2"));
// 500
Command commandIn2 = new MoneyInCommand(account, 500);
invoker.SetCommand(commandIn2);
invoker.ExecuteCommand();
Console.WriteLine("The current amount is " + account.GetTotalAmout().ToString("N2"));
// 300
Command commandOut = new MoneyOutCommand(account, 300);
invoker.SetCommand(commandOut);
invoker.ExecuteCommand();
Console.WriteLine("The current amount is " + account.GetTotalAmout().ToString("N2"));
Console.Read();
}
}
실행 결과이상 이 바로 본문의 전체 내용 입 니 다.여러분 께 참고 가 될 수 있 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.