Теория 📔
July 29, 2024
Паттерн "Стратегия"
Паттерн "Стратегия" (Strategy Pattern) — это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Паттерн позволяет выбрать алгоритм во время выполнения программы.
В контексте Angular и TypeScript, этот паттерн можно использовать для выбора различных стратегий обработки данных, отображения, валидации и других аспектов поведения приложения.
Представим, что у нас есть форма, в которой могут быть разные стратегии валидации, такие как базовая валидация и расширенная валидация.
Шаг 1: Определение интерфейса стратегии
// validation-strategy.ts
export interface ValidationStrategy {
validate(value: string): boolean;
}
Шаг 2: Реализация конкретных стратегий
// basic-validation-strategy.ts
import { ValidationStrategy } from './validation-strategy';
export class BasicValidationStrategy implements ValidationStrategy {
validate(value: string): boolean {
// Базовая валидация: строка не должна быть пустой
return value.trim().length > 0;
}
}
// advanced-validation-strategy.ts
import { ValidationStrategy } from './validation-strategy';
export class AdvancedValidationStrategy implements ValidationStrategy {
validate(value: string): boolean {
// Расширенная валидация: строка не должна быть пустой и должна содержать хотя бы одну цифру
return value.trim().length > 0 && /\d/.test(value);
}
}
Шаг 3: Контекст, использующий стратегию
// validation-context.ts
import { ValidationStrategy } from './validation-strategy';
export class ValidationContext {
private strategy: ValidationStrategy;
constructor(strategy: ValidationStrategy) {
this.strategy = strategy;
}
setStrategy(strategy: ValidationStrategy) {
this.strategy = strategy;
}
validate(value: string): boolean {
return this.strategy.validate(value);
}
}
Шаг 4: Использование в Angular компоненте
// app.component.ts
import { Component } from '@angular/core';
import { ValidationContext } from './validation-context';
import { BasicValidationStrategy } from './basic-validation-strategy';
import { AdvancedValidationStrategy } from './advanced-validation-strategy';
@Component({
selector: 'app-root',
template: `
<div>
<input [(ngModel)]="inputValue" placeholder="Enter value" />
<button (click)="validate()">Validate</button>
<p>{{ validationMessage }}</p>
<button (click)="setBasicValidation()">Basic Validation</button>
<button (click)="setAdvancedValidation()">Advanced Validation</button>
</div>
`,
})
export class AppComponent {
inputValue: string = '';
validationMessage: string = '';
private validationContext: ValidationContext;
constructor() {
// По умолчанию использовать базовую стратегию валидации
this.validationContext = new ValidationContext(new BasicValidationStrategy());
}
validate() {
const isValid = this.validationContext.validate(this.inputValue);
this.validationMessage = isValid ? 'Valid!' : 'Invalid!';
}
setBasicValidation() {
this.validationContext.setStrategy(new BasicValidationStrategy());
}
setAdvancedValidation() {
this.validationContext.setStrategy(new AdvancedValidationStrategy());
}
}
Объяснение
- ValidationStrategy: Интерфейс, который определяет метод
validate. - BasicValidationStrategy и AdvancedValidationStrategy: Конкретные стратегии, реализующие интерфейс
ValidationStrategy. - ValidationContext: Контекст, который использует стратегию для валидации. Он содержит метод
setStrategyдля установки текущей стратегии и методvalidateдля выполнения валидации. - AppComponent: Angular компонент, который позволяет пользователю выбирать между базовой и расширенной стратегией валидации и отображает результат валидации.
Этот пример демонстрирует, как можно использовать паттерн "Стратегия" в Angular и TypeScript для создания гибких и легко изменяемых решений.