전략 모드
기원
Delphi의 STRATEGY 모드는 STRATEGY를 기반으로 확장되었습니다. STRATEGY 모드에 대한 자세한 내용은 "디자인 패턴 페이지 208"을 참조하세요.
목적
일련의 알고리즘을 정의하고 하나씩 캡슐화하여 상호 교환 가능하게 만듭니다. 이 패턴은 알고리즘을 사용하는 클라이언트의 변경 사항에 독립적인 알고리즘을 만듭니다.
동기 부여
? 필요에 따라 다양한 전략을 동적으로 변환할 수 있습니다. ? 클라이언트 프로그램이 직접 간섭하는 것을 허용하지 않고 여러 동작과 알고리즘 구조를 더 잘 캡슐화합니까? 관련 조건문을 통해 올바른 동작 방법을 선택하십시오.
템플릿 메서드는 상속을 사용하여 알고리즘의 일부를 변환합니다. 전략은 프록시와 조합을 사용하여 모든 알고리즘을 변환하고 동적 변환을 지원합니다. 앞으로는 런타임에 특정 알고리즘을 동적으로 할당하는 데 컨텍스트 개체가 사용됩니다. 마찬가지로, context 객체를 사용하면 클라이언트 클래스가 종속적인 알고리즘 인터페이스와 분리되며, context 객체를 통해 보다 일반화된 인터페이스를 제공할 수 있습니다. 같은 의미에서
컨텍스트 및
전략 인터페이스를 통해 향후 시스템 전반에 걸친 관련 알고리즘을 설계하고 제공하여 인터페이스를 변경하지 않고도 특정 애플리케이션을 구현할 수 있습니다. 또한
전략을 사용 하면 간단하고 유지 관리가 가능한 단일 클래스 프레임워크를 만들 수 있습니다. 클래스 프레임워크는 상속에 의존합니다.
애플리케이션
구현
다음 예에서는 신용카드의 월별 이자율을 계산합니다.
전략 모드는 고유한 추상 클래스 TfinanzeCharge를 통해 인터페이스를 캡슐화하고 액세스하며 월별 이자율을 계산하는 다양한 알고리즘을 제공합니다. TregularCharge 및 TPReferredCharge는 신용 카드의 월별 이자율 계산을 위한 다양한 특정 알고리즘을 캡슐화합니다. TmonthlyCharge는 TcontextCharge 인터페이스를 구현하고 다양한 정책 개체를 구성합니다. TconntextCharge는 클라이언트 개체 및 전략 개체의 미드필드 엔진이 되어 클라이언트 개체 및 전략/개체의 종속성을 줄이는 데 도움이 됩니다.
// 전략 인터페이스( 추상 클래스) TFinanzeCharge = class public //계산된 결과 반환
function getCharge(const Balance: double): double // 특정 전략 TRegularCharge = class(TFinanzeCharge) public
function getCharge(const) Balance: double): double; override ; end;
// 특정 전략 TPreferredCharge = class(TFinanzeCharge) public
function getCharge(const Balance: double); end;클라이언트 프로그램은 컨텍스트 인터페이스를 사용하여 지정된 전략을 예약합니다. 그러나 클라이언트 프로그램을 위해 컨텍스트 인터페이스가 생성되므로 클라이언트 프로그램은 사용 가능한 정책/객체를 알아야 합니다. 컨텍스트가 유효한 인스턴스를 반환할 수 없는 경우 선택적으로 기본 전략을 사용하여 메서드 구현을 선택할 수 있습니다.
// 컨텍스트 인터페이스 TChargeContext = class public
function ComputeCharges(const Balance: double): double; virtual; abstract ; end;
// 특정 컨텍스트 클래스 TmonthlyCharges는 클라이언트 객체와 전략 객체의 미드필드 엔진 역할을 합니다. 생성자 특정 이자율 계산 인스턴스가 설정됩니다.
이 클래스는 클라이언트와 전략 클래스 사이의 중재자 역할을 하며 구성을 사용하고 생성자에서 구체적인 금융 비용 인스턴스를 전달하여 구성됩니다.
TMonthlyCharges = class(TChargeContext) private FFinanzeCharge; public//
클라이언트 프로그램에서 액세스하는 인터페이스 함수 ComputeCharges(const Balance: double): double; // 생성자는 컨텍스트 개체 생성자를 구성합니다. Create(aFinanzeCharge: TFinanzeCharge); Destroy; end;---구현
// TRegularCharge 함수 TRegularCharge.getCharge(const Balance: double): double;begin result := Balance * (REG_RATE / 12);end;
// TPreferredCharge 함수 TPreferredCharge.getCharge(const Balance: double): double;begin // 이는 복잡할 수 있습니다. // 신용카드 소지자의 구매 패턴과 적립된 포인트를 고려한 알고리즘 result := Balance * (PREFERRED_RATE / 12);
// 구체성 Context // TMonthlyCharges 생성자 TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);begin 상속됨 Create; // aFinanzeCharge는 컨텍스트 객체를 구성합니다. // 이 클래스는 aFinanzeCharge의 소유권을 갖습니다(파괴합니다) FFinanzeCharge := aFinanzeCharge;end;destructor TMonthlyCharges.Destroy; FFinanzeCharge.Free를 상속받습니다. Destroy;end;function TMonthlyCharges.ComputeCharges(const Balance: double): double;begin result := FFinanzeCharge.getCharge(Balance);end;
델파이 예제