C\#디자인 모드 시리즈 튜 토리 얼-명령 모드

8226 단어 C#디자인 모드
1.개술
하나의 요청 을 하나의 대상(즉,우리 가 만 든 Command 대상)으로 밀봉 하여 서로 다른 요청 으로 고객 을 매개 변수 화 할 수 있 도록 합 니 다.요청 대기 열 이나 요청 로 그 를 기록 하고 취소 가능 한 동작 을 지원 합 니 다.
2.해결 하 는 문제
소프트웨어 시스템 에서 행위 요구 자 와 행위 실현 자 는 보통 긴밀 한 결합 관계 이지 만 어떤 경우 에는 행위 에 대해 기록,취소 또는 재 작업,사무 등 처 리 를 해 야 할 때 변 화 를 막 을 수 없 는 긴밀 한 결합 디자인 이 적합 하지 않다.
3.모드 에서 의 캐릭터
3.1 추상 명령(Command):명령 의 인 터 페 이 스 를 정의 하고 실행 방법 을 설명 합 니 다.
3.2 구체 적 인 명령(Concretecond):구체 적 인 명령,실행 할 방법 을 실현 하 는 것 은 보통'허'의 실현 이다.보통 수신 자가 있 고 수신 자의 기능 을 호출 하여 명령 이 실 행 될 동작 을 수행 합 니 다.
3.3 수신 자(Receiver):명령 을 진정 으로 수행 하 는 대상.모든 종 류 는 명령 이 요구 하 는 해당 기능 을 실현 할 수만 있다 면 수신 자가 될 수 있다.
3.4 호출 자(Invoker):명령 대상 에 게 요청 을 수행 하도록 요구 합 니 다.보통 명령 대상 을 가지 고 많은 명령 대상 을 가 질 수 있 습 니 다.이것 은 클 라 이언 트 가 진정 으로 명령 을 실행 하고 명령 을 실행 하도록 요구 하 는 곳 입 니 다.즉,명령 대상 을 사용 하 는 입구 에 해당 합 니 다.
3.5 클 라 이언 트(Client):명령 은 클 라 이언 트 가 만 들 고 명령 의 수신 자 를 설정 합 니 다.
4.패턴 판독
4.1 명령 모드 의 도표
//img.jbzj.com/file_images/article/201606/201606011014469.png
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();
  }
 }
실행 결과
//img.jbzj.com/file_images/article/201606/2016060110144610.png
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 분류 도
//img.jbzj.com/file_images/article/201606/2016060110144611.png
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();
  }
 }

실행 결과
//img.jbzj.com/file_images/article/201606/2016060110144612.png
이상 이 바로 본문의 전체 내용 입 니 다.여러분 께 참고 가 될 수 있 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기