ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования Π² Node.js, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ распространСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния.

Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования Π² Node.js:

  • ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ способом, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π°ΠΌ врСмя ΠΈ усилия ΠΏΡ€ΠΈ создании ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
  • ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ структуру ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ нашСго ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ роста ΠΈ развития Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
  • Удобство сопровоТдСния. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π½Π°ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ для сопровоТдСния ΠΊΠΎΠ΄ Π·Π° счСт раздСлСния Π·Π°Π΄Π°Ρ‡ ΠΈ обязанностСй, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ дублирования ΠΊΠΎΠ΄Π° ΠΈ обСспСчСния согласованности.
  • Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π² Π½Π°ΡˆΠΈΡ… прилоТСниях, Π½Π΅ влияя Π½Π° ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наш ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌΡΡ трСбованиям.
  • ΠšΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠ΄Π°. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ кодирования, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ абстракция, инкапсуляция ΠΈ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ отвСтствСнности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Π±ΠΎΠ»Π΅Π΅ высокому качСству ΠΈ надСТности ΠΊΠΎΠ΄Π°.

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ, ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π² сопровоТдСнии, Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΈ Π±ΠΎΠ»Π΅Π΅ качСствСнным, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ созданию Π±ΠΎΠ»Π΅Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

πŸ’‘ ИмСнно Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π‘ΠΈΡ‚. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌΡ‹ΠΉ, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ для Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ нСзависимоС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, тСстированиС ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² вмСсто Ρ†Π΅Π»Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΈ становится Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π² сопровоТдСнии. Π­Ρ‚ΠΎ руководство ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π²Π°ΠΌ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаблон проСктирования с ΠΊΠΎΠ΄ΠΎΠΌ Π² ситуации Π»ΠΎΠ³ΠΈΠΊΠΈ слуТбы Β«Π’Ρ…ΠΎΠ΄Β».

Π‘ΠΈΠ½Π³Π»Ρ‚ΠΎΠ½ шаблон

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Singleton, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр слуТбы Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ создаСтся ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для управлСния ΠΎΠ±Ρ‰ΠΈΠΌΠΈ рСсурсами, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ сСкрСтный ΠΊΠ»ΡŽΡ‡ JWT ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

class AuthenticationService {
  constructor() {
    this.jwtSecret = 'secret'; // initialize the JWT secret key
    this.userDb = new DatabaseConnection('mongodb://localhost/users'); // initialize the user database connection
  }

  static getInstance() {
    if (!AuthenticationService.instance) {
      AuthenticationService.instance = new AuthenticationService();
    }

    return AuthenticationService.instance;
  }

  // authentication logic
  async authenticate(username, password) {
    const user = await this.userDb.findUserByUsername(username);
    if (user && user.password === password) {
      const token = jwt.sign({ username: user.username }, this.jwtSecret);
      return { token };
    } else {
      throw new Error('Invalid username or password');
    }
  }
}

// Usage:
const authService = AuthenticationService.getInstance();

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм класс Singleton с ΠΈΠΌΠ΅Π½Π΅ΠΌ AuthenticationService, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт сСкрСтным ΠΊΠ»ΡŽΡ‡ΠΎΠΌ JWT ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΠ΅Ρ‚ΠΎΠ΄ authenticate() выполняСт Π»ΠΎΠ³ΠΈΠΊΡƒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½ JWT, Ссли имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π²Π΅Ρ€Π½Ρ‹.

Заводской ΡƒΠ·ΠΎΡ€

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Factory для создания Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² стратСгий Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° основС Ρ‚ΠΈΠΏΠ° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ стратСгии для локальной Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡ„Π°ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

class AuthenticationStrategyFactory {
  static createStrategy(type) {
    if (type === 'local') {
      return new LocalAuthenticationStrategy();
    } else if (type === 'social') {
      return new SocialMediaAuthenticationStrategy();
    } else if (type === 'multi-factor') {
      return new MultiFactorAuthenticationStrategy();
    } else {
      throw new Error(`Unsupported authentication type: ${type}`);
    }
  }
}

// Usage:
const strategy = AuthenticationStrategyFactory.createStrategy('local');

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм класс Factory с ΠΈΠΌΠ΅Π½Π΅ΠΌ AuthenticationStrategyFactory, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ стратСгий Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ°. ΠœΡ‹ создаСм Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ стратСгии, LocalAuthenticationStrategy, SocialMediaAuthenticationStrategy ΠΈ MultiFactorAuthenticationStrategy, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ°.

Π¨Π°Π±Π»ΠΎΠ½ ПО ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ слоя

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ срСд Π½Π° основС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Express.js.

class AuthenticationMiddleware extends Middleware {
  constructor(strategy) {
    super();
    this.strategy = strategy;
  }

  async _handle(req, res, next) {
    try {
      const result = await this.strategy.authenticate(req.body.username, req.body.password);
      req.user = result;
      next();
    } catch (error) {
      res.status(401).json({ error: error.message });
    }
  }
}

// Usage:
const strategy = AuthenticationStrategyFactory.createStrategy('local');
const middleware = new AuthenticationMiddleware(strategy);
app.post('/login', middleware.handle.bind(middleware), (req, res) => {
  res.json({ token: req.user.token });
});

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм класс ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО с ΠΈΠΌΠ΅Π½Π΅ΠΌ AuthenticationMiddleware, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ подлинности с использованиСм ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ стратСгии. ΠœΠ΅Ρ‚ΠΎΠ΄ handle() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ПО ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ слоя, Π° функция next() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ запроса ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ПО ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ слоя Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. Если аутСнтификация Π½Π΅ ΡƒΠ΄Π°Π»Π°ΡΡŒ, ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ возвращаСтся сообщСниС ΠΎΠ± ошибкС.

Π¨Π°Π±Π»ΠΎΠ½ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Observer для увСдомлСния Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ слуТб, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² систСму ΠΈΠ»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Π½Π΅Π΅. НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ слуТбу рСгистрации ΠΈΠ»ΠΈ слуТбу Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² систСму ΠΈΠ»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Π½Π΅Π΅.

class LoginService {
  constructor() {
    this.observers = [];
  }

  addObserver(observer) {
    this.observers.push(observer);
  }

  removeObserver(observer) {
    this.observers = this.observers.filter((o) => o !== observer);
  }

  async login(username, password) {
    const authService = AuthenticationService.getInstance();
    const result = await authService.authenticate(username, password);

    // notify the observers
    this.notifyObservers({ username });

    return result;
  }

  async logout(token) {
    // revoke the token
    const authService = AuthenticationService.getInstance();
    const user = jwt.verify(token, authService.jwtSecret);
    const tokenRevoked = await this.revokeToken(user.username, token);

    // notify the observers
    this.notifyObservers({ username: user.username });

    return tokenRevoked;
  }

  notifyObservers(data) {
    this.observers.forEach((observer) => observer.update(data));
  }
}

// Usage:
const loginService = new LoginService();
loginService.addObserver(new LoggingService());
loginService.addObserver(new AnalyticsService());

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм класс LoginService, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ»ΠΈ слуТбы. ΠœΠ΅Ρ‚ΠΎΠ΄ login() выполняСт Π»ΠΎΠ³ΠΈΠΊΡƒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½ JWT, Ссли имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π²Π΅Ρ€Π½Ρ‹. ΠœΠ΅Ρ‚ΠΎΠ΄ logout() ΠΎΡ‚Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½ ΠΈ увСдомляСт Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· систСмы. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ addObserver() ΠΈ removeObserver() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для управлСния Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡΠΌΠΈ, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ notifyObservers() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для увСдомлСния всСх Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· систСмы.

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ стратСгии

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон стратСгии для опрСдСлСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… стратСгий Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ сцСнариСв. НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ стратСгии для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ администратора, ΠΏΡ€Π΅ΠΌΠΈΡƒΠΌ-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ API.

class AdminAuthenticationStrategy extends LocalAuthenticationStrategy {
  async authenticate(username, password) {
    const user = await this.authService.userDb.findUserByUsername(username);
    if (user && user.password === password && user.role === 'admin') {
      const token = jwt.sign({ username: user.username }, this.authService.jwtSecret);
      return { token };
    } else {
      throw new Error('Invalid username or password');
    }
  }
}

class PremiumAuthenticationStrategy extends LocalAuthenticationStrategy {
  async authenticate(username, password) {
    const user = await this.authService.userDb.findUserByUsername(username);
    if (user && user.password === password && user.subscription === 'premium') {
      const token = jwt.sign({ username: user.username }, this.authService.jwtSecret);
      return { token };
    } else {
      throw new Error('Invalid username or password');
    }
  }
}

// Usage:
const authService = AuthenticationService.getInstance();
const localStrategy = new LocalAuthenticationStrategy(authService);
const adminStrategy = new AdminAuthenticationStrategy(authService);
const premiumStrategy = new PremiumAuthenticationStrategy(authService);

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм Ρ€Π°Π·Π½Ρ‹Π΅ стратСгии Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ администратора ΠΈ ΠΏΡ€Π΅ΠΌΠΈΡƒΠΌ-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ LocalAuthenticationStrategy. ΠœΠ΅Ρ‚ΠΎΠ΄ authenticate() Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стратСгии провСряСт Ρ€ΠΎΠ»ΡŒ ΠΈΠ»ΠΈ подписку ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ Ρ‚ΠΎΠΊΠ΅Π½Π° JWT.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅

Π‘ΠΈΠ½Π³Π»Ρ‚ΠΎΠ½ шаблон

  • Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹: класс Singleton, конструктор, статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ getInstance(), пСрСмСнная ΠΎΠ±Ρ‰Π΅Π³ΠΎ экзСмпляра, Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ конструктор.
  • ЦСль: Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр класса создаСтся ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
  • ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°: позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ создания Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… экзСмпляров ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, обСспСчиваСт ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ рСсурсами.

Заводской ΡƒΠ·ΠΎΡ€

  • Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹: класс Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ, ΠΌΠ΅Ρ‚ΠΎΠ΄(Ρ‹) создания, класс(Ρ‹) ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, Π»ΠΎΠ³ΠΈΠΊΠ° создания ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, абстрактный класс ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ).
  • ЦСль: ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π΅ раскрывая Π»ΠΎΠ³ΠΈΠΊΡƒ создания ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ настройку создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  • ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°: Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ процСсс создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ связь ΠΌΠ΅ΠΆΠ΄Ρƒ клиСнтским ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ созданиС экзСмпляра ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π¨Π°Π±Π»ΠΎΠ½ ПО ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ слоя

  • Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹: класс ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, ΠΌΠ΅Ρ‚ΠΎΠ΄ handle(), функция next() ΠΈΠ»ΠΈ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ запроса ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°.
  • ЦСль: ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов ΠΈΠ»ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….
  • ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°: способствуСт ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ слоТной Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, обСспСчиваСт Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ настройку Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π¨Π°Π±Π»ΠΎΠ½ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ

  • Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹: класс ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚Π°, класс(Ρ‹) Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ registerObserver() ΠΈ removeObserver(), ΠΌΠ΅Ρ‚ΠΎΠ΄ notifyObservers(), ΠΌΠ΅Ρ‚ΠΎΠ΄ update() Π² Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡΡ….
  • ЦСль: ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Β«ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ» ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° всС Π΅Π³ΠΎ зависимыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ»ΠΈΡΡŒ ΠΈ обновлялись автоматичСски.
  • ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°: способствуСт ΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ, позволяСт динамичСски ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ стратСгии

  • Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹: класс контСкста, интСрфСйс ΠΈΠ»ΠΈ класс стратСгии, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ классы стратСгии, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ setStrategy() ΠΈ executeStrategy().
  • ЦСль: ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ сСмСйство Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… взаимозамСняСмыми Π² зависимости ΠΎΡ‚ контСкста ΠΈΠ»ΠΈ срСды.
  • ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°: инкапсулируСт Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ повСдСния, обСспСчиваСт Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ настройку повСдСния, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ обслуТиваниС ΠΈ тСстированиС ΠΊΠΎΠ΄Π°.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ шаблон проСктирования ΠΈΠΌΠ΅Π΅Ρ‚ свой ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ элСмСнтов, Ρ†Π΅Π»Π΅ΠΉ ΠΈ прСимущСств. Понимая ΠΈ примСняя эти ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ качСство, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ, Ρ€Π΅ΠΌΠΎΠ½Ρ‚ΠΎΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈΡ… ΠΊΠΎΠ΄Π° ΠΈ, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Π΅ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Π΅ прилоТСния.

Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡ‚Π΅ прилоТСния с ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠ°ΠΊ Lego

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ Bit ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 250 000 Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прилоТСния с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ.

ΠŸΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ любой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ страницу Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ использования β€” ΠΈ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ ΠΈΠΌ со своими прилоТСниями. Π›Π΅Π³Ρ‡Π΅ ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‡Π°Ρ‚ΡŒ ΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ быстрСС.

β†’ ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ прилоТСния Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈ Π½Π°ΡΠ»Π°ΠΆΠ΄Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌΠΈ возмоТностями для Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… процСссов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅:

β†’ ΠœΠΈΠΊΡ€ΠΎ-интСрфСйсы

β†’ БистСма Π΄ΠΈΠ·Π°ΠΉΠ½Π°

β†’ БовмСстноС использованиС ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС

β†’ ΠœΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎ

Π£Π·Π½Π°Ρ‚ΡŒ большС