Теория 📔
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 для создания гибких и легко изменяемых решений.