Skip to content

Vediusse/lab6

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Π­Ρ‚ΠΎ конспСкт Π° Π½Π΅ описаниС самой Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Ρ‚ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ интСрСсныС вопросы ΠΏΠΎ Π»Π°Π±Π°ΠΌ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ²

https://kirieshkiforkotiki.ru/

Волько Ρ‚Ρ‰Ρ‰Ρ‰Ρ‰Ρ‰ - это сСркСтная ссылка - Π½Π΅ ΠΊΠΈΠ΄Π°ΠΉΡ‚Π΅ Π² ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ‡Π°Ρ‚Ρ‹ - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ срСди своих Π΄Ρ€ΡƒΠ·Π΅ΠΉ

ДобавляйтС свои вопрос - Π­Ρ‚ΠΎ супСр Π²Π°ΠΆΠ½ΠΎ

Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ взаимодСйствиС: ΠšΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΈ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹

ΠšΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°

ΠšΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· основных ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² сСтСвом взаимодСйствии. Π’ этой ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΈΠ»ΠΈ устройство, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ услуги, называСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΈΠ»ΠΈ устройство, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ услуги, называСтся сСрвСром.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹

HTTP (Hypertext Transfer Protocol)

HTTP являСтся ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ уровня, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ гипСртСкстовых Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² сСти Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚. Он основан Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ запрос-ΠΎΡ‚Π²Π΅Ρ‚, Π³Π΄Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ отправляСт запрос Π½Π° сСрвСр, Π° сСрвСр ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° этот запрос, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ прСдоставляя Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹Π΅ рСсурсы.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запроса HTTP:

GET /index.html HTTP/1.1
Host: www.example.com

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π° HTTP:

HTTP/1.1 200 OK
Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>

TCP (Transmission Control Protocol)

TCP являСтся ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ транспортного уровня, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ ΠΈ упорядочСнноС доставку Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ устройствами Π² сСти. Он Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, устанавливаСт соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром, ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ установлСния TCP соСдинСния:

import java.net.*;

public class TCPClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8080);
            // ВзаимодСйствиС с сСрвСром
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

UDP (User Datagram Protocol)

UDP Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ транспортного уровня, Π½ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· установлСния соСдинСния ΠΈ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ доставку Π΄Π°Π½Π½Ρ‹Ρ…. Он обСспСчиваСт Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ, Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ подходящим для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π³Π΄Π΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π²Π°ΠΆΠ½Π΅Π΅ надСТности.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования UDP Π² Java:

import java.net.*;

public class UDPClient {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket();
            // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ…
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Бходства ΠΈ отличия

HTTP, TCP ΠΈ UDP ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… сСтях, Π½ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ характСристики ΠΈ примСнСния:

  • HTTP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ гипСртСкстовых Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅, TCP обСспСчиваСт Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π° UDP обСспСчиваСт Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ, Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….
  • TCP ΠΈ UDP Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ установлСния соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ HTTP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ модСль запрос-ΠΎΡ‚Π²Π΅Ρ‚ Π±Π΅Π· сохранСния состояния.
  • TCP Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½ΡƒΡŽ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ UDP Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· этих аспСктов.

Π­Ρ‚ΠΎ основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² TCP, UDP ΠΈ HTTP Π² сСтСвом взаимодСйствии.

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP ΠΈ классы Socket ΠΈ ServerSocket

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP (Transmission Control Protocol)

TCP - это ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» транспортного уровня, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΈ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ устройствами Π² сСти. Он Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доставлСны Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС ΠΈ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ.

ΠšΠ»Π°ΡΡΡ‹ Socket ΠΈ ServerSocket

Π’ Java для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ TCP-соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ классы Socket ΠΈ ServerSocket.

Класс Socket

Socket прСдставляСт собой ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ соСдинСния TCP ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром. Он обСспСчиваСт срСдства для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ получСния Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания клиСнтского сокСта Π² Java:

import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сокСта для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ сСрвСру Π½Π° localhost ΠΈ ΠΏΠΎΡ€Ρ‚Ρƒ 8080
            Socket socket = new Socket("localhost", 8080);
            
            // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с сСрвСром
            OutputStream outputStream = socket.getOutputStream();
            InputStream inputStream = socket.getInputStream();
            
            // ВзаимодСйствиС с сСрвСром
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сокСта
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Класс ServerSocket

ServerSocket ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания сСрвСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ входящиС соСдинСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Он ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΈ ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ создаСт Π½ΠΎΠ²Ρ‹ΠΉ сокСт для общСния с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания сСрвСрного сокСта Π² Java:

import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСрвСрного сокСта, привязанного ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ 8080
            ServerSocket serverSocket = new ServerSocket(8080);
            
            // ОТиданиС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
            Socket clientSocket = serverSocket.accept();
            
            // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ
            OutputStream outputStream = clientSocket.getOutputStream();
            InputStream inputStream = clientSocket.getInputStream();
            
            // ВзаимодСйствиС с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сокСтов
            clientSocket.close();
            serverSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Π’Ρ‹Π²ΠΎΠ΄

ΠšΠ»Π°ΡΡΡ‹ Socket ΠΈ ServerSocket ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ TCP-соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром Π² Java. Класс Socket ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания клиСнтского сокСта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ сСрвСру, Π° ServerSocket - для создания сСрвСрного сокСта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ входящиС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Π­Ρ‚ΠΈ классы ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ с использованиСм TCP.

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UDP ΠΈ классы DatagramSocket ΠΈ DatagramPacket

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UDP (User Datagram Protocol)

UDP - это ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» транспортного уровня, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΈ Π½Π΅ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ устройствами Π² сСти. Он обСспСчиваСт Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· установлСния соСдинСния ΠΈ Π±Π΅Π· Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ доставки.

ΠšΠ»Π°ΡΡΡ‹ DatagramSocket ΠΈ DatagramPacket

Π’ Java для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ UDP-соСдинСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ классы DatagramSocket ΠΈ DatagramPacket.

Класс DatagramSocket

DatagramSocket прСдставляСт собой сокСт для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ получСния Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ (ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…) ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ UDP. Он Π½Π΅ устанавливаСт постоянноС соСдинСниС ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… источников.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания сокСта для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π² Java:

import java.net.*;

public class UDPSocket {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сокСта для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ…
            DatagramSocket socket = new DatagramSocket();
            
            // ВзаимодСйствиС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΡƒΠ·Π»Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· сокСт
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сокСта
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Класс DatagramPacket

DatagramPacket прСдставляСт собой ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π΄Π°Π½Π½Ρ‹Π΅, адрСс отправитСля ΠΈ ΠΏΠΎΡ€Ρ‚. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ получСния Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ Ρ‡Π΅Ρ€Π΅Π· DatagramSocket.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Π² Java:

import java.net.*;

public class UDPSender {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ
            byte[] data = "Hello, World!".getBytes();
            InetAddress address = InetAddress.getByName("localhost");
            int port = 8080;
            DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
            
            // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Ρ‡Π΅Ρ€Π΅Π· сокСт
            DatagramSocket socket = new DatagramSocket();
            socket.send(packet);
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сокСта
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ получСния Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Π² Java:

import java.net.*;

public class UDPReceiver {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сокСта для ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ…
            DatagramSocket socket = new DatagramSocket(8080);
            
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π° для ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            
            // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Ρ‡Π΅Ρ€Π΅Π· сокСт
            socket.receive(packet);
            
            // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…
            String message = new String(packet.getData(), 0, packet.getLength());
            System.out.println("Received message: " + message);
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сокСта
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Π’Ρ‹Π²ΠΎΠ΄

ΠšΠ»Π°ΡΡΡ‹ DatagramSocket ΠΈ DatagramPacket ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ UDP-соСдинСниС Π² Java. DatagramSocket ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, Π° DatagramPacket - для прСдставлСния Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, адрСсом ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠΌ. UDP обСспСчиваСт Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ, Π½ΠΎ Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ подходящим для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π³Π΄Π΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π²Π°ΠΆΠ½Π΅Π΅ надСТности.

Когда ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ UPD ?

Π”Π°, UDP ΠΈ TCP ΠΈΠΌΠ΅ΡŽΡ‚ свои сфСры примСнСния, ΠΈ Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ прилоТСния.

Π’ΠΎΡ‚ нСсколько случаСв, ΠΊΠΎΠ³Π΄Π° программисты ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ UDP TCP:

  1. Π’ΠΈΠ΄Π΅ΠΎ ΠΈ Π°ΡƒΠ΄ΠΈΠΎ трансляции Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: Π’ прилоТСниях, Π³Π΄Π΅ Π²Π°ΠΆΠ½Π° низкая Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΈ потСря Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ°Π΄Ρ€ΠΎΠ² Π½Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΈΠ΄Π΅ΠΎΠ·Π²ΠΎΠ½ΠΊΠΈ ΠΈΠ»ΠΈ стриминг), UDP часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. TCP, с Π΅Π³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ слишком Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈ нСэффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ сСти.

  2. Π˜Π³Ρ€Ρ‹: Π’ ΠΎΠ½Π»Π°ΠΉΠ½-ΠΈΠ³Ρ€Π°Ρ…, Π³Π΄Π΅ быстрота Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, UDP ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅. Он позволяСт ΠΈΠ³Ρ€ΠΎΠ²Ρ‹ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ сообщСния ΠΎ дСйствиях (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, пСрСмСщСния, Π°Ρ‚Π°ΠΊΠΈ), минимизируя Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈΠ³Ρ€Ρ‹ ΠΈΠ·-Π·Π° ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Для ΠΈΠ³Ρ€, Π³Π΄Π΅ качСство соСдинСния Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ, UDP прСдоставляСт простоту ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ.

  3. IoT (Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π²Π΅Ρ‰Π΅ΠΉ): Π’ сфСрС IoT часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ устройства с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ рСсурсами ΠΈ нСпостоянным соСдинСниСм. UDP позволяСт ΠΈΠΌ быстро ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ нСбольшиС ΠΏΠΎΡ€Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° установку соСдинСния ΠΈ обслуТиваниС TCP.

  4. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ для обнаруТСния устройств ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ сообщСния: Π’ сСтях, Π³Π΄Π΅ трСбуСтся ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний всСм устройствам ΠΈΠ»ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… устройств, UDP ΡˆΠΈΡ€ΠΎΠΊΠΎ примСняСтся благодаря своСй простотС ΠΈ эффСктивности.

Π’ этих случаях Π³Π»Π°Π²Π½ΠΎΠ΅ прСимущСство UDP - это ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ простота, Π΄Π°ΠΆΠ΅ Π·Π° счСт ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Если потСря Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎΠΉ, ΠΈΠ»ΠΈ Ссли трСбуСтся гарантированная доставка ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, TCP остаСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ.

Когда Tcp ?

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ! Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠΎΠ³Π΄Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TCP:

  1. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… объСмов Π΄Π°Π½Π½Ρ‹Ρ…: ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, TCP обСспСчиваСт Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΈ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½ΡƒΡŽ доставку Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅Π½, ΠΈ нСдопустима Π΄Π°ΠΆΠ΅ нСбольшая потСря.

  2. Π’Π΅Π±-сайты ΠΈ прилоТСния с Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ: ΠŸΡ€ΠΈ доступС ΠΊ Π²Π΅Π±-сайтам ΠΈΠ»ΠΈ прилоТСниям, Π³Π΄Π΅ Ρ†Π΅Π½Π½Ρ‹ Π»ΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ банковскиС Π΄Π°Π½Π½Ρ‹Π΅, личная информация), TCP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обСспСчСния бСзопасной ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· HTTPS. Π—Π΄Π΅ΡΡŒ нСдопустима потСря Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ цСлостности.

  3. ЭлСктронная ΠΏΠΎΡ‡Ρ‚Π°: ΠŸΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Π΅ сСрвСры ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ TCP для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ получСния элСктронных писСм. Π­Ρ‚ΠΎ обСспСчиваСт Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ доставку писСм Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΠΈ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС.

  4. Онлайн Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ банковскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΎΠ½Π»Π°ΠΉΠ½-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ банковских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ TCP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обСспСчСния бСзопасности ΠΈ надСТности ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ финансовых Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ каТдая транзакция Π±Ρ‹Π»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ доставлСна ΠΈ Π½Π΅ Π±Ρ‹Π»Π° ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π° манипуляциям.

  5. Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ прилоТСния с установлСниСм соСдинСния ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°: Π’ прилоТСниях, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ установлСниС постоянного соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, TCP являСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ мСссСндТСры, Π²ΠΈΠ΄Π΅ΠΎΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ, сСтСвыС ΠΈΠ³Ρ€Ρ‹ с высокими трСбованиями ΠΊ надСТности ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ соСдинСния.

Π’ этих сцСнариях TCP обСспСчиваСт Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ошибками, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ Π² случаях, ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ пСрвостСпСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠšΠ»Π°ΡΡΡ‹ SocketChannel ΠΈ DatagramChannel Π² Java

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ Java сущСствуСт нСсколько способов Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСтСвого взаимодСйствия, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ свои особСнности ΠΈ прСимущСства. Π Π°Π½Π΅Π΅ ΠΌΡ‹ рассмотрСли классы Socket ΠΈ ServerSocket для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с TCP ΠΈ классы DatagramSocket ΠΈ DatagramPacket для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с UDP. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΡ… ΠΈ ΠΌΠΎΡ‰Π½Ρ‹Ρ… Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°Ρ… - классах SocketChannel ΠΈ DatagramChannel.

SocketChannel

SocketChannel - это ΠΊΠ°Π½Π°Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сокСтами Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. Π­Ρ‚ΠΎΡ‚ класс являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° java.nio, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π±ΠΎΠ»Π΅Π΅ эффСктивныС ΠΈ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° (I/O) для сСтСвых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

DatagramChannel

DatagramChannel - это ΠΊΠ°Π½Π°Π» для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ java.nio. Он прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ получСния Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UDP.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° использования ΠΊΠ°Π½Π°Π»ΠΎΠ²

  1. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ: ΠšΠ°Π½Π°Π»Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π±Π΅Π· оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… прилоТСниях, Π³Π΄Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ нСсколько ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

  2. ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: ΠšΠ°Π½Π°Π»Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ нСсколько ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π­Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ прилоТСния.

  3. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ: ΠšΠ°Π½Π°Π»Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° асинхронно, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ асинхронных сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с SocketChannel:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class SocketChannelExample {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ SocketChannel
            SocketChannel socketChannel = SocketChannel.open();
            
            // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру
            socketChannel.connect(new InetSocketAddress("localhost", 8080));
            
            // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…
            String message = "Hello, Server!";
            ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
            socketChannel.write(buffer);
            
            // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ сСрвСра
            ByteBuffer responseBuffer = ByteBuffer.allocate(1024);
            socketChannel.read(responseBuffer);
            String response = new String(responseBuffer.array()).trim();
            System.out.println("Response from server: " + response);
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π°
            socketChannel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с DatagramChannel:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelExample {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ DatagramChannel
            DatagramChannel datagramChannel = DatagramChannel.open();
            
            // ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ адрСсу ΠΈ ΠΏΠΎΡ€Ρ‚Ρƒ
            datagramChannel.bind(new InetSocketAddress(8080));
            
            // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹
            String message = "Hello, Client!";
            ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
            datagramChannel.send(buffer, new InetSocketAddress("localhost", 9090));
            
            // Π§Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
            ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);
            datagramChannel.receive(receiveBuffer);
            String receivedMessage = new String(receiveBuffer.array()).trim();
            System.out.println("Received message from client: " + receivedMessage);
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π°
            datagramChannel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

ΠšΠ»Π°ΡΡΡ‹ SocketChannel ΠΈ DatagramChannel ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ эффСктивныС срСдства для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСтСвыми соСдинСниями Π² Java. Π˜Ρ… использованиС ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, особСнно Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΈ асинхронной срСдС.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти ΠΈ сСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Java часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром. БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² позволяСт ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ структурированныС Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ, прСвращая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ восстанавливая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠ½Ρ†Π΅ соСдинСния.

БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java - это процСсс прСобразования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² для Π΅Π³ΠΎ сохранСния Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎ сСти. ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ процСсс, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ восстанавливаСтся ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ², называСтся дСсСриализациСй.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сСриализации ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎ сСти с использованиСм сСриализации ΠΈ дСсСриализации.

Класс для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}

Код для сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π° сторонС сСрвСра)

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("Server started. Waiting for client...");
            
            Socket socket = serverSocket.accept();
            System.out.println("Client connected.");
            
            ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
            Person person = new Person("John", 30);
            outputStream.writeObject(person);
            
            outputStream.close();
            socket.close();
            serverSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Код для ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°)

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8080);
            
            ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
            Person receivedPerson = (Person) inputStream.readObject();
            System.out.println("Received person: " + receivedPerson.getName() + ", " + receivedPerson.getAge());
            
            inputStream.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java позволяСт ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ структурированныС Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ сСти. Она являСтся основным ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ для ΠΎΠ±ΠΌΠ΅Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром Π² сСтСвых прилоТСниях. ΠŸΡ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ использовании сСриализация ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сСтСвоС взаимодСйствиС Π±ΠΎΠ»Π΅Π΅ эффСктивным ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Serializable ΠΈ сСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ Java интСрфСйс Serializable прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для прСобразования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ², которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сохранСна Π² Ρ„Π°ΠΉΠ»Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° ΠΏΠΎ сСти ΠΈΠ»ΠΈ сохранСна Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎΡ‚ процСсс называСтся сСриализациСй. ПослС сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ восстановлСн ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎ называСтся дСсСриализациСй.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„

Π’ контСкстС сСриализации ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java часто упоминаСтся Ρ‚Π΅Ρ€ΠΌΠΈΠ½ "ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„". ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ - это Π½Π°Π±ΠΎΡ€ связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠŸΡ€ΠΈ сСриализации ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² вСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ обрабатываСтся ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с сСриализациСй ΠΈ дСсСриализациСй

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ класс Person, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}

БСриализация:

import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Person
            Person person = new Person("John", 30);
            
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π°
            ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("person.ser"));
            
            // БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
            outputStream.writeObject(person);
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π°
            outputStream.close();
            
            System.out.println("Person ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» сСриализован.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ДСсСриализация:

import java.io.*;

public class DeserializationExample {
    public static void main(String[] args) {
        try {
            // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π°
            ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("person.ser"));
            
            // ДСсСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
            Person restoredPerson = (Person) inputStream.readObject();
            
            // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π°
            inputStream.close();
            
            System.out.println("ВосстановлСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Person: " + restoredPerson.getName() + ", " + restoredPerson.getAge());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

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

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Serializable Π² Java прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСриализации ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ². ΠŸΡ€ΠΈ сСриализации ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² вСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ обрабатываСтся ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅, Π° всС поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Java для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сохранСния состояния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

Java Stream API: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΎΠ², ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Stream API

Java Stream API прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с коллСкциями ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС. Он Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²ΡƒΡŽ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ - ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… (Stream), которая позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ элСмСнтами ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… прСдставляСт собой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ элСмСнтов, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΎΠ²

Π’ Stream API ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ (pipeline) - это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ элСмСнтам ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги:

  1. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°: Π‘Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ источника Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ массив ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ.

  2. ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: ПослС получСния ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΈΠ»ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΡŽΡ‚ элСмСнты ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

  3. Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ опСрация: НаконСц, ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, которая выполняСт ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ дСйствиС Π½Π°Π΄ элСмСнтами ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°.

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π»Π΅Π½ΠΈΠ²ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. НСкоторыС ΠΈΠ· часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  • filter(): Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ элСмСнтов ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°.
  • map(): ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.
  • sorted(): Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° элСмСнтов ΠΏΠΎΡ‚ΠΎΠΊΠ°.
  • distinct(): Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ приводят ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Они ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΈΠ»ΠΈ выполнСния дСйствия. НСкоторыС ΠΈΠ· часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  • forEach(): Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ дСйствия для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΏΠΎΡ‚ΠΎΠΊΠ°.
  • collect(): Π‘Π±ΠΎΡ€ элСмСнтов ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ….
  • count(): ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ количСства элСмСнтов Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅.
  • reduce(): Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ элСмСнтами ΠΏΠΎΡ‚ΠΎΠΊΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сумма, максимум).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Stream API с использованиСм лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Alice", "Bob", "Charlie", "David");

        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°
        long count = names.stream()
                .filter(name -> name.startsWith("A"))
                .map(String::toUpperCase)
                .count();

        System.out.println("ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…ΡΡ с Π±ΡƒΠΊΠ²Ρ‹ 'A': " + count);
    }
}

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

Java Stream API прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с коллСкциями ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΈΠ»ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΡŽΡ‚ элСмСнты ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ИспользованиС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Stream API Π±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΠΉ ΠΈ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ.

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Decorator

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Decorator относится ΠΊ классу структурных шаблонов проСктирования ΠΈ позволяСт динамичСски Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π±Π΅Π· измСнСния ΠΈΡ… ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎΡ‚ шаблон прСдоставляСт Π³ΠΈΠ±ΠΊΡƒΡŽ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ наслСдованию для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ классов.

ЦСль

ЦСль Decorator состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ динамичСски Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ возмоТности ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², оборачивая ΠΈΡ… Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Component: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.
  2. ConcreteComponent: ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ основной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.
  3. Decorator: Абстрактный класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Component ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Component. Π­Ρ‚ΠΎΡ‚ класс ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Component.
  4. ConcreteDecorator: Π Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Component, добавляя Π½ΠΎΠ²Ρ‹Π΅ возмоТности ΠΈΠ»ΠΈ измСняя Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ интСрфСйс Pizza, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для ΠΏΠΈΡ†Ρ†Ρ‹. Π£ нас Π΅ΡΡ‚ΡŒ базовая рСализация ΠΏΠΈΡ†Ρ†Ρ‹ - MargheritaPizza. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ динамичСски Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½Π³Ρ€Π΅Π΄ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΊ ΠΏΠΈΡ†Ρ†Π΅, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ сыр, ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Ρ‹ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π° MargheritaPizza. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Decorator для этой Π·Π°Π΄Π°Ρ‡ΠΈ.

// ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚
interface Pizza {
    String getDescription();
    double getCost();
}

// Основной ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚
class MargheritaPizza implements Pizza {
    @Override
    public String getDescription() {
        return "Margherita Pizza";
    }

    @Override
    public double getCost() {
        return 6.99;
    }
}

// Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€
abstract class PizzaDecorator implements Pizza {
    protected Pizza pizza;

    public PizzaDecorator(Pizza pizza) {
        this.pizza = pizza;
    }

    @Override
    public String getDescription() {
        return pizza.getDescription();
    }

    @Override
    public double getCost() {
        return pizza.getCost();
    }
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€
class CheeseDecorator extends PizzaDecorator {
    public CheeseDecorator(Pizza pizza) {
        super(pizza);
    }

    @Override
    public String getDescription() {
        return pizza.getDescription() + ", Cheese";
    }

    @Override
    public double getCost() {
        return pizza.getCost() + 1.50;
    }
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€
class TomatoDecorator extends PizzaDecorator {
    public TomatoDecorator(Pizza pizza) {
        super(pizza);
    }

    @Override
    public String getDescription() {
        return pizza.getDescription() + ", Tomato";
    }

    @Override
    public double getCost() {
        return pizza.getCost() + 0.75;
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΏΠΈΡ†Ρ†Ρƒ
        Pizza pizza = new MargheritaPizza();
        
        // ДобавляСм сыр
        pizza = new CheeseDecorator(pizza);
        
        // ДобавляСм ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Ρ‹
        pizza = new TomatoDecorator(pizza);
        
        // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ описаниС ΠΈ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΈΡ†Ρ†Ρ‹
        System.out.println("Description: " + pizza.getDescription());
        System.out.println("Cost: $" + pizza.getCost());
    }
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΏΠΈΡ†Ρ†Ρƒ MargheritaPizza, Π° Π·Π°Ρ‚Π΅ΠΌ динамичСски добавляСм ΠΊ Π½Π΅ΠΉ сыр ΠΈ ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ CheeseDecorator ΠΈ TomatoDecorator. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π° основного ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΠΈΡ†Ρ†Ρ‹.

ИспользованиС Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π’ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ шаблон Decorator ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для динамичСского добавлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ HTTP-запросов ΠΈΠ»ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ². НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ HttpRequest, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ для добавлСния Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, сТатия Π΄Π°Π½Π½Ρ‹Ρ…, логирования ΠΈ Ρ‚.Π΄.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Component: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠΉΡ‚Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.
  2. Абстрактный Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€: Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ абстрактный класс Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Component.
  3. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Component, добавляя Π½ΠΎΠ²Ρ‹Π΅ возмоТности ΠΈΠ»ΠΈ измСняя Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π¨Π°Π±Π»ΠΎΠ½ Decorator прСдоставляСт Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈ элСгантный способ добавлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Ρ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости ΠΈ Π±Π΅Π· нСобходимости создания мноТСства подклассов.

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Iterator

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Iterator являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· повСдСнчСских шаблонов проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт способ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ доступа ΠΊ элСмСнтам ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π±Π΅Π· раскрытия Π΅Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ прСдставлСния. Π­Ρ‚ΠΎΡ‚ шаблон позволяСт ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнты ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, Π½Π΅ зная Π΅Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ устройства.

ЦСль

ЦСль шаблона Iterator Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΉ интСрфСйс для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, скрывая Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ клиСнтского ΠΊΠΎΠ΄Π°.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Iterator: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс для доступа ΠΈ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.
  2. ConcreteIterator: Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Iterator ΠΈ содСрТит ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.
  3. Aggregate: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.
  4. ConcreteAggregate: Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Aggregate ΠΈ создаСт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ коллСкция Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ², ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° этой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.

// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Iterator
interface Iterator<T> {
    boolean hasNext();
    T next();
}

// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Aggregate
interface Aggregate<T> {
    Iterator<T> createIterator();
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ
class FruitIterator implements Iterator<String> {
    private String[] fruits;
    private int position = 0;

    public FruitIterator(String[] fruits) {
        this.fruits = fruits;
    }

    @Override
    public boolean hasNext() {
        return position < fruits.length;
    }

    @Override
    public String next() {
        if (hasNext()) {
            return fruits[position++];
        }
        return null;
    }
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ коллСкция Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ²
class FruitCollection implements Aggregate<String> {
    private String[] fruits;

    public FruitCollection(String[] fruits) {
        this.fruits = fruits;
    }

    @Override
    public Iterator<String> createIterator() {
        return new FruitIterator(fruits);
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        String[] fruits = {"Apple", "Banana", "Orange"};

        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ²
        Aggregate<String> fruitCollection = new FruitCollection(fruits);

        // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€
        Iterator<String> iterator = fruitCollection.createIterator();

        // ΠŸΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ„Ρ€ΡƒΠΊΡ‚Ρ‹
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм интСрфСйс Iterator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ hasNext() ΠΈ next() для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта ΠΈ получСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта соотвСтствСнно. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ FruitIterator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ этот интСрфСйс для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов массива Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ². Класс FruitCollection прСдставляСт собой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ², которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Aggregate для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

ИспользованиС Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π’ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ шаблон Iterator ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов Π²Π΅Π±-ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ списки Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ элСмСнты Π²Π΅Π±-страницы. НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ прилоТСния для ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° списка Π΄Ρ€ΡƒΠ·Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΊ Π΅Π³ΠΎ постам.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Iterator: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ hasNext() ΠΈ next(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.
  2. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Aggregate: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ createIterator(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° для вашСй ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.
  3. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€: Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для вашСй ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнты Π² соотвСтствии с вашими трСбованиями.

Π¨Π°Π±Π»ΠΎΠ½ Iterator прСдоставляСт простой ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, скрывая Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚ клиСнтского ΠΊΠΎΠ΄Π° ΠΈ обСспСчивая Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΉ интСрфСйс доступа ΠΊ элСмСнтам.

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Factory Method

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Factory Method относится ΠΊ классу ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… шаблонов проСктирования ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· указания ΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… классов. Π­Ρ‚ΠΎΡ‚ шаблон Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ процСсс создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² подклассам, позволяя подклассам ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ создаваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

ЦСль

ЦСль шаблона Factory Method состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ интСрфСйс для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² супСрклассС, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ подклассам ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ создаваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Creator: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ подклассы для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  2. ConcreteCreator: Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ для создания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  3. Product: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс создаваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  4. ConcreteProduct: ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ создаваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ„Π°Π±Ρ€ΠΈΠΊΠ° ΠΏΠΎ производству транспортных срСдств. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ транспортных срСдств, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΠΈ, Π³Ρ€ΡƒΠ·ΠΎΠ²ΠΈΠΊΠΈ ΠΈ вСлосипСды, Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ транспортный срСдство ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ситуации.

// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ транспортного срСдства
interface Transport {
    void deliver();
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ рСализация автомобиля
class Car implements Transport {
    @Override
    public void deliver() {
        System.out.println("Car is delivering...");
    }
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ рСализация Π³Ρ€ΡƒΠ·ΠΎΠ²ΠΈΠΊΠ°
class Truck implements Transport {
    @Override
    public void deliver() {
        System.out.println("Truck is delivering...");
    }
}

// Π€Π°Π±Ρ€ΠΈΠΊΠ° ΠΏΠΎ производству транспортных срСдств
abstract class TransportFactory {
    abstract Transport createTransport();
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° транспортного срСдства
class CarFactory extends TransportFactory {
    @Override
    Transport createTransport() {
        return new Car();
    }
}

class TruckFactory extends TransportFactory {
    @Override
    Transport createTransport() {
        return new Truck();
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ для производства Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ
        TransportFactory carFactory = new CarFactory();
        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ
        Transport car = carFactory.createTransport();
        // ДоставляСм Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΌ
        car.deliver();

        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ для производства Π³Ρ€ΡƒΠ·ΠΎΠ²ΠΈΠΊΠΎΠ²
        TransportFactory truckFactory = new TruckFactory();
        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π³Ρ€ΡƒΠ·ΠΎΠ²ΠΈΠΊ
        Transport truck = truckFactory.createTransport();
        // ДоставляСм Π³Ρ€ΡƒΠ·ΠΎΠ²ΠΈΠΊΠΎΠΌ
        truck.deliver();
    }
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм интСрфСйс Transport, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ транспортноС срСдство, ΠΈ Π΄Π²Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого интСрфСйса: Car ΠΈ Truck. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм абстрактный класс TransportFactory, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ createTransport(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для создания экзСмпляров транспортных срСдств. Π”Π²Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… класса CarFactory ΠΈ TruckFactory Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ TransportFactory ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ createTransport() для создания ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… транспортных срСдств.

ИспользованиС Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π¨Π°Π±Π»ΠΎΠ½ Factory Method часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ экзСмпляры классов, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… запросы ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π²Π΅Π±-сСрвисам. НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Π΅Π±-прилоТСния Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для создания экзСмпляров классов, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… HTTP-запросы, Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° запроса ΠΈΠ»ΠΈ URL.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. Creator (TransportFactory): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ подклассы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  2. ConcreteCreator (CarFactory, TruckFactory): Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ для создания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ подкласс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ экзСмпляр ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса-ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°.
  3. Product (Transport): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ интСрфСйс ΠΈΠ»ΠΈ абстрактный класс для создаваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  4. ConcreteProduct (Car, Truck): Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ классы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², создаваСмыС Ρ„Π°Π±Ρ€ΠΈΠΊΠΎΠΉ.

Π¨Π°Π±Π»ΠΎΠ½ Factory Method обСспСчиваСт Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ Π² создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², позволяя Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°.

НСкоС Π½Π΅ понимаю - для Ρ‡Π΅Π³ΠΎ это ???? Ну Π²Π°Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½ΠΈΠ΅ классы с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ (условиС Ρ‚Π°ΠΌ ΠΊΠΎΡ€ΠΎΡ‡)

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Command

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Command относится ΠΊ классу повСдСнчСских шаблонов проСктирования ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для инкапсуляции запроса Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎΡ‚ шаблон позволяСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ клиСнтскиС запросы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ позволяСт ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ историСй Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

ЦСль

ЦСль шаблона Command состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запрос ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, позволяя ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ динамичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈ с ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Command: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс для выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ дСйствия.
  2. ConcreteCommand: Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Command ΠΈ связываСт сСбя с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими получатСлями, выполняя ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ дСйствия.
  3. Invoker: Π—Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, связанныС с Command, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ историСй Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄.
  4. Receiver: ВыполняСт фактичСскоС дСйствиС, связанноС с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡƒΠ»ΡŒΡ‚ управлСния для ΡƒΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ свСта, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π΄Π²Π΅Ρ€ΠΈ ΠΈ Ρ‚.Π΄. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Command для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого ΠΏΡƒΠ»ΡŒΡ‚Π° управлСния.

// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
interface Command {
    void execute();
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ рСализация ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ свСта
class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ рСализация ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для открытия Π΄Π²Π΅Ρ€ΠΈ
class DoorOpenCommand implements Command {
    private Door door;

    public DoorOpenCommand(Door door) {
        this.door = door;
    }

    @Override
    public void execute() {
        door.open();
    }
}

// ΠŸΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
class Light {
    public void turnOn() {
        System.out.println("Light is on");
    }

    public void turnOff() {
        System.out.println("Light is off");
    }
}

// ΠŸΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
class Door {
    public void open() {
        System.out.println("Door is open");
    }

    public void close() {
        System.out.println("Door is closed");
    }
}

// Π˜Π½Π²ΠΎΠΊΠ΅Ρ€ - ΡƒΠΌΠ½Ρ‹ΠΉ ΠΏΡƒΠ»ΡŒΡ‚ управлСния
class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
        Light light = new Light();
        Door door = new Door();

        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
        Command lightOnCommand = new LightOnCommand(light);
        Command doorOpenCommand = new DoorOpenCommand(door);

        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡƒΠΌΠ½Ρ‹ΠΉ ΠΏΡƒΠ»ΡŒΡ‚
        RemoteControl remoteControl = new RemoteControl();

        // Настройка ΠΏΡƒΠ»ΡŒΡ‚Π°
        remoteControl.setCommand(lightOnCommand);

        // НаТимаСм ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π° ΠΏΡƒΠ»ΡŒΡ‚Π΅
        remoteControl.pressButton();

        // МСняСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
        remoteControl.setCommand(doorOpenCommand);

        // НаТимаСм ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π° ΠΏΡƒΠ»ΡŒΡ‚Π΅
        remoteControl.pressButton();
    }
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм интСрфСйс Command, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ execute() для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ LightOnCommand ΠΈ DoorOpenCommand, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ этот интСрфСйс ΠΈ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ получатСлями ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Light ΠΈ Door). RemoteControl прСдставляСт ΡƒΠΌΠ½Ρ‹ΠΉ ΠΏΡƒΠ»ΡŒΡ‚ управлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ для выполнСния этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

ИспользованиС Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π¨Π°Π±Π»ΠΎΠ½ Command ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² HTTP-запросов ΠΈΠ»ΠΈ дСйствий ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Π΅Π±-прилоТСния Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… дСйствий ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Ρ„ΠΎΡ€ΠΌΡ‹, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CRUD (созданиС, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅) ΠΈ Ρ‚.Π΄.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. Command (интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ execute(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для выполнСния дСйствий.
  2. ConcreteCommand (ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄): Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ execute(), Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ фактичСскоС дСйствиС получатСля ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.
  3. Receiver (ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹): Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ фактичСскиС дСйствия, связанныС с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄.
  4. Invoker (ΠΈΠ½Π²ΠΎΠΊΠ΅Ρ€): Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ запросу.

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Flyweight

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Flyweight относится ΠΊ классу структурных шаблонов проСктирования ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с большим количСством ΠΌΠ΅Π»ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Он позволяСт ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, раздСляя ΠΎΠ±Ρ‰Π΅Π΅ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ.

ЦСль

ЦСль шаблона Flyweight состоит Π² ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ использования памяти ΠΈΠ»ΠΈ рСсурсов ΠΏΡƒΡ‚Π΅ΠΌ раздСлСния ΠΎΠ±Ρ‰Π΅Π³ΠΎ состояния ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Flyweight: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ лСгковСсы ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ внСшнСС состояниС.
  2. ConcreteFlyweight: Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Flyweight ΠΈ содСрТит Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся раздСляСмым.
  3. FlyweightFactory: Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΠΈ управляСт лСгковСсами, обСспСчивая ΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС.
  4. Client: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ лСгковСсы, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ управлСния состояниСм ΠΈ получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· интСрфСйс Flyweight.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для создания ΠΈ управлСния тСкстовыми Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, ΠΈ Π² этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС памяти ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с символами тСкста. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Flyweight для этой Π·Π°Π΄Π°Ρ‡ΠΈ.

// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ лСгковСса
interface Character {
    void print();
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ лСгковСс для символа тСкста
class ConcreteCharacter implements Character {
    private char symbol;

    public ConcreteCharacter(char symbol) {
        this.symbol = symbol;
    }

    @Override
    public void print() {
        System.out.print(symbol);
    }
}

// Π€Π°Π±Ρ€ΠΈΠΊΠ° лСгковСсов
class CharacterFactory {
    private Map<Character, ConcreteCharacter> characters = new HashMap<>();

    public Character getCharacter(char symbol) {
        ConcreteCharacter character = characters.get(symbol);
        if (character == null) {
            character = new ConcreteCharacter(symbol);
            characters.put(symbol, character);
        }
        return character;
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        String text = "Hello, world!";
        CharacterFactory characterFactory = new CharacterFactory();

        for (char c : text.toCharArray()) {
            Character character = characterFactory.getCharacter(c);
            character.print();
        }
    }
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм интСрфСйс Character, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ символ тСкста, ΠΈ Π΅Π³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ConcreteCharacter. Класс CharacterFactory прСдставляСт Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ лСгковСсов, которая создаСт ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ экзСмпляры лСгковСсов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ создания Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ…ΡΡ символов.

ИспользованиС Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π¨Π°Π±Π»ΠΎΠ½ Flyweight ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с большим количСством ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ изобраТСния, ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹, Ρ†Π²Π΅Ρ‚Π° ΠΈ Ρ‚.Π΄. НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Π΅Π±-прилоТСния для создания графичСских элСмСнтов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лСгковСсы для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с изобраТСниями ΠΈΠ»ΠΈ Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. Flyweight (лСгковСс): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ интСрфСйс для лСгковСсов ΠΈ раздСляСмоС состояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. ЛСгковСсы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ бСзопасными для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ бСзопасно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС.
  2. ConcreteFlyweight (ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ лСгковСс): Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ лСгковСсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ раздСляСмым ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ экзСмплярами.
  3. FlyweightFactory (Ρ„Π°Π±Ρ€ΠΈΠΊΠ° лСгковСсов): Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ, которая управляСт созданиСм ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ лСгковСсов. Π€Π°Π±Ρ€ΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ раздСляСмого состояния сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр лСгковСса.
  4. Client (ΠΊΠ»ΠΈΠ΅Π½Ρ‚): Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ лСгковСсы Ρ‡Π΅Ρ€Π΅Π· ΠΈΡ… интСрфСйс. ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ лСгковСсы Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΈ экономию памяти.

Ρ‚ΠΎΠΆΠ΅ всю Π½ΠΎΡ‡ΡŒ Ρ‡ΠΈΡ‚Π°Π» Π½Π΅ понял? Ну Ρ‚ΠΈΠΏ кэш ΠΈΠ»ΠΈ Set ?

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Interpreter

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Interpreter относится ΠΊ классу повСдСнчСских шаблонов проСктирования ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ языка ΠΈΠ»ΠΈ выраТСния. Он позволяСт ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ простыС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈ синтаксичСскиС конструкции Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСт способ описания ΠΏΡ€Π°Π²ΠΈΠ» для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ этих конструкций.

ЦСль

ЦСль шаблона Interpreter состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ способ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ выполнСния Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… языковых конструкций ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. AbstractExpression (абстрактноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ контСкста.
  2. TerminalExpression (Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅): Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс AbstractExpression ΠΈ прСдставляСт Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ (Π½Π΅ раздСляСмыС) ΡƒΠ·Π»Ρ‹ Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅.
  3. NonterminalExpression (Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅): Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс AbstractExpression ΠΈ прСдставляСт Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ (раздСляСмыС) ΡƒΠ·Π»Ρ‹ Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅.
  4. Context (контСкст): Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΠΎ врСмя ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ выраТСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ простого языка для вычислСния арифмСтичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ польской записи (Reverse Polish Notation, RPN).

// АбстрактноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
interface Expression {
    int interpret(Context context);
}

// Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для чисСл
class NumberExpression implements Expression {
    private int number;

    public NumberExpression(int number) {
        this.number = number;
    }

    @Override
    public int interpret(Context context) {
        return number;
    }
}

// ΠΠ΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния
class AddExpression implements Expression {
    private Expression left;
    private Expression right;

    public AddExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context) + right.interpret(context);
    }
}

// ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ для хранСния Π΄Π°Π½Π½Ρ‹Ρ…
class Context {
    // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ выраТСния: 3 + 2
        Expression expression = new AddExpression(new NumberExpression(3), new NumberExpression(2));

        // Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
        Context context = new Context();
        int result = expression.interpret(context);
        System.out.println("Result: " + result); // Π’Ρ‹Π²ΠΎΠ΄: Result: 5
    }
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм интСрфСйс Expression, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ абстрактноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ. Класс NumberExpression прСдставляСт Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для чисСл, Π° AddExpression - Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния. Класс Context ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ выраТСния.

ИспользованиС Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π¨Π°Π±Π»ΠΎΠ½ Interpreter ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΈ выполнСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… запросов ΠΈΠ»ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ интСрфСйса для создания ΠΈ управлСния слоТными запросами ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ API, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Interpreter для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ запросов ΠΈ выполнСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… дСйствий.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. АбстрактноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (Expression): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ интСрфСйс для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎΡ‚ интСрфСйс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ interpret(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ контСкст ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ.
  2. Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ выраТСния: Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ классы Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ.
  3. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ (Context): Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ класс для хранСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ выраТСния.
  4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ интСрфСйс Expression для создания ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

Π·Π°Ρ‡Π΅ΠΌ это Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ совсСм понятно - Π½Ρƒ просто чисто ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Singleton

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Singleton относится ΠΊ классу ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… шаблонов проСктирования ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обСспСчСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ класса Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр, ΠΈ прСдоставляСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ доступа ΠΊ этому экзСмпляру.

ЦСль

ЦСль шаблона Singleton состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ класс ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр, ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ доступа ΠΊ этому экзСмпляру.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Singleton: Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр.
  2. getInstance(): БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр Singleton.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ класса Singleton Π² Java.

public class Singleton {
    // ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ΅ статичСскоС ΠΏΠΎΠ»Π΅ для хранСния экзСмпляра Singleton
    private static Singleton instance;

    // ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ конструктор, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ созданиС экзСмпляров ΠΈΠ·Π²Π½Π΅
    private Singleton() {
    }

    // БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ для получСния СдинствСнного экзСмпляра Singleton
    public static Singleton getInstance() {
        // Если экзСмпляр Π΅Ρ‰Π΅ Π½Π΅ создан, создаСм Π΅Π³ΠΎ
        if (instance == null) {
            instance = new Singleton();
        }
        // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ экзСмпляр
        return instance;
    }
}

ИспользованиС

public class Main {
    public static void main(String[] args) {
        // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ экзСмпляр Singleton
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();

        // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° экзСмпляра ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ
        System.out.println(singleton1 == singleton2); // Π’Ρ‹Π²ΠΎΠ΄: true
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

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

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ конструктор: Класс Singleton Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ конструктор, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ созданиС экзСмпляров ΠΈΠ·Π²Π½Π΅.
  2. БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ getInstance(): Π’ классС Singleton Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ СдинствСнный экзСмпляр Singleton. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ создаСт экзСмпляр, Ссли Π΅Π³ΠΎ Π΅Ρ‰Π΅ Π½Π΅Ρ‚, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ экзСмпляр, Ссли ΠΎΠ½ ΡƒΠΆΠ΅ Π±Ρ‹Π» создан.
  3. ЛСнивая инициализация: Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π½ΠΈΠ²ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ экзСмпляр Singleton создавался Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° getInstance().

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Strategy

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Strategy относится ΠΊ классу повСдСнчСских шаблонов проСктирования ΠΈ прСдставляСт собой ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ЦСль

ЦСль шаблона Strategy состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ сСмСйство Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² зависимости ΠΎΡ‚ ситуации.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Strategy (стратСгия): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс ΠΈΠ»ΠΈ абстрактный класс для всСх ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².
  2. ConcreteStrategy (конкрСтная стратСгия): Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² интСрфСйсС Strategy.
  3. Context (контСкст): Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ стратСгии для выполнСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ шаблона Strategy для сортировки массива Ρ†Π΅Π»Ρ‹Ρ… чисСл Π² Java.

// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ стратСгии
interface SortingStrategy {
    void sort(int[] array);
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ стратСгии сортировки
class BubbleSortStrategy implements SortingStrategy {
    @Override
    public void sort(int[] array) {
        // РСализация сортировки ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌ
    }
}

class QuickSortStrategy implements SortingStrategy {
    @Override
    public void sort(int[] array) {
        // РСализация быстрой сортировки
    }
}

// ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚
class SortContext {
    private SortingStrategy strategy;

    public SortContext(SortingStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(SortingStrategy strategy) {
        this.strategy = strategy;
    }

    public void performSort(int[] array) {
        strategy.sort(array);
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        int[] array = {5, 2, 7, 1, 3};

        // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ сортировки ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌ
        SortingStrategy bubbleSort = new BubbleSortStrategy();
        SortContext sortContext = new SortContext(bubbleSort);
        sortContext.performSort(array);

        // Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ быстрой сортировки
        SortingStrategy quickSort = new QuickSortStrategy();
        sortContext.setStrategy(quickSort);
        sortContext.performSort(array);
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π’ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ шаблон Strategy ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для опрСдСлСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов ΠΈΠ»ΠΈ выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² зависимости ΠΎΡ‚ контСкста. НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Π΅Π±-прилоТСния Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Strategy для Π²Ρ‹Π±ΠΎΡ€Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… стратСгий Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, стратСгий ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ стратСгий ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ запросов.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ стратСгии: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ интСрфСйс ΠΈΠ»ΠΈ абстрактный класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ всСми ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ стратСгиями.
  2. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ стратСгии: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ классы, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ интСрфСйс стратСгии ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹.
  3. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ стратСгии для выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… дСйствий. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для установки ΠΈ измСнСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ стратСгии, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с использованиСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ стратСгии.

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Adapter

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Adapter относится ΠΊ классу структурных шаблонов проСктирования ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для соСдинСния Π΄Π²ΡƒΡ… нСсовмСстимых интСрфСйсов. Он позволяСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ с нСсовмСстимыми интСрфСйсами Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вмСстС.

ЦСль

ЦСль шаблона Adapter состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Π² интСрфСйс, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. Π­Ρ‚ΠΎ позволяСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ с нСсовмСстимыми интСрфСйсами Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вмСстС Π±Π΅Π· измСнСния исходного ΠΊΠΎΠ΄Π°.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Target (Ρ†Π΅Π»Π΅Π²ΠΎΠΉ интСрфСйс): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.
  2. Adaptee (Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ класс): Класс, Ρ‡Π΅ΠΉ интСрфСйс нСсовмСстим с Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ интСрфСйсом.
  3. Adapter (Π°Π΄Π°ΠΏΡ‚Π΅Ρ€): ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ интСрфСйс Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ класса Π² интСрфСйс Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ класса.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π° для совмСстной Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π²ΡƒΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… интСрфСйсов Π² Java.

// Π¦Π΅Π»Π΅Π²ΠΎΠΉ интСрфСйс
interface Target {
    void request();
}

// АдаптируСмый класс
class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee's specific request");
    }
}

// АдаптСр
class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ класса
        Adaptee adaptee = new Adaptee();

        // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€
        Target adapter = new Adapter(adaptee);

        // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ интСрфСйсом
        adapter.request();
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π’ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ шаблон Adapter ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… источников ΠΈΠ»ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ для прСобразования Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ JSON ΠΈΠ»ΠΈ XML для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΡ… ΠΏΠΎ сСти.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ класса (Target): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠΌ.
  2. АдаптируСмый класс (Adaptee): Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ класс, Ρ‡Π΅ΠΉ интСрфСйс нСсовмСстим с Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ интСрфСйсом.
  3. АдаптСр (Adapter): Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ класс Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ интСрфСйс ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ класс для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Facade

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Facade относится ΠΊ классу структурных шаблонов проСктирования ΠΈ прСдставляСт собой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ интСрфСйс для доступа ΠΊ подсистСмС Π±ΠΎΠ»Π΅Π΅ высокого уровня. Он ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ слоТныС систСмы, прСдоставляя Π±ΠΎΠ»Π΅Π΅ простой интСрфСйс.

ЦСль

ЦСль шаблона Facade состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ простой интСрфСйс для взаимодСйствия с комплСксной подсистСмой, скрывая Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ упрощая использованиС этой подсистСмы.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Facade (фасад): ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ интСрфСйс для доступа ΠΊ подсистСмС.
  2. Subsystem (подсистСма): Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ фасада для управлСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ автомобиля.

// ΠŸΠΎΠ΄ΡΠΈΡΡ‚Π΅ΠΌΠ°: Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ
class Engine {
    public void start() {
        System.out.println("Engine started");
    }
    
    public void stop() {
        System.out.println("Engine stopped");
    }
}

// ΠŸΠΎΠ΄ΡΠΈΡΡ‚Π΅ΠΌΠ°: трансмиссия
class Transmission {
    public void shiftGear() {
        System.out.println("Gear shifted");
    }
}

// Ѐасад: Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ
class Car {
    private Engine engine;
    private Transmission transmission;
    
    public Car() {
        this.engine = new Engine();
        this.transmission = new Transmission();
    }
    
    public void start() {
        engine.start();
        transmission.shiftGear();
        System.out.println("Car started");
    }
    
    public void stop() {
        engine.stop();
        System.out.println("Car stopped");
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.start();
        car.stop();
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π’ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ шаблон Facade ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для управлСния слоТными опСрациями, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° запросов ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ запросов Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ взаимодСйствиС с внСшними сСрвисами. Ѐасад позволяСт ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ простой интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. Ѐасад (Facade): Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ класс-фасад, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ подсистСмы ΠΈ прСдоставляСт ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ интСрфСйс для ΠΈΡ… использования.
  2. ΠŸΠΎΠ΄ΡΠΈΡΡ‚Π΅ΠΌΠ° (Subsystem): Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ вашСго прилоТСния Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ. Ѐасад Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ.
  3. ΠŸΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: Ѐасад Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ для ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ подсистСмы.

Π¨Π°Π±Π»ΠΎΠ½ проСктирования: Proxy

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Proxy относится ΠΊ классу структурных шаблонов проСктирования ΠΈ прСдставляСт собой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выступаСт Π² качСствС замСститСля ΠΈΠ»ΠΈ placeholder'Π° для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠŸΡ€ΠΎΠΊΡΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ доступ ΠΊ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, позволяя Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия Π΄ΠΎ ΠΈΠ»ΠΈ послС обращСния ΠΊ Π½Π΅ΠΌΡƒ.

ЦСль

ЦСль шаблона Proxy состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, прСдоставляя ΠΏΡ€ΠΈ этом Ρ‚ΠΎΡ‚ ΠΆΠ΅ интСрфСйс. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для управлСния доступом ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π΅Π³ΠΎ создания, удалСния ΠΈΠ»ΠΈ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  1. Subject (ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс для RealSubject ΠΈ Proxy, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Proxy ΠΌΠΎΠ³ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ RealSubject.
  2. RealSubject (Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚): ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ обращаСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚.
  3. Proxy (прокси): Π₯Ρ€Π°Π½ΠΈΡ‚ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ RealSubject, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ доступ ΠΊ Π½Π΅ΠΌΡƒ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия Π΄ΠΎ ΠΈΠ»ΠΈ послС обращСния ΠΊ RealSubject.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования прокси для управлСния доступом ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Calculator.

// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚Π°
interface Calculator {
    int add(int a, int b);
}

// Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚
class RealCalculator implements Calculator {
    @Override
    public int add(int a, int b) {
        return a + b;
    }
}

// ΠŸΡ€ΠΎΠΊΡΠΈ
class CalculatorProxy implements Calculator {
    private RealCalculator calculator = new RealCalculator();

    @Override
    public int add(int a, int b) {
        // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° RealCalculator
        System.out.println("Before calling RealCalculator");
        
        // Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρƒ RealCalculator
        int result = calculator.add(a, b);
        
        // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия послС Π²Ρ‹Π·ΠΎΠ²Π° RealCalculator
        System.out.println("After calling RealCalculator");
        
        return result;
    }
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
public class Main {
    public static void main(String[] args) {
        // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· прокси
        Calculator proxy = new CalculatorProxy();
        
        // Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· прокси
        int result = proxy.add(5, 3);
        System.out.println("Result: " + result);
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

Π’ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ шаблон Proxy ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для контроля доступа ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ рСсурсам, ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ…, логирования запросов ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ HTTP-запросов ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π½Π° сСрвСр.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  1. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ доступа: ΠŸΡ€ΠΎΠΊΡΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для контроля доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, провСряя ΠΏΡ€Π°Π²Π° доступа ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
  2. ЛСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°: ΠŸΡ€ΠΎΠΊΡΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° откладываСтся Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ обращСния.
  3. Π£Π΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ доступ: ΠŸΡ€ΠΎΠΊΡΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для доступа ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, скрывая Π΄Π΅Ρ‚Π°Π»ΠΈ взаимодСйствия с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ сСрвСром.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ

ΠŸΡ€ΠΈ сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Java с интСрфСйсом Π΅ΡΡ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ. Π’ процСссС сСриализации сохраняСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½ΠΎ ΠΈ информация ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Ρ‚Π°ΠΊ называСмая мСтаинформация). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Java сохраняСт имя класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π΅Π³ΠΎ сСрийный Π½ΠΎΠΌΠ΅Ρ€ (serialVersionUID).

Когда Π²Ρ‹ сСриализуСтС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс, Java сохраняСт имя класса этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ случаС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ, Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ класс, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ этому ΠΈΠΌΠ΅Π½ΠΈ, Π±Ρ‹Π» доступСн. Если класс отсутствуСт, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassNotFoundException.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС классы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ сСриализации ΠΈ дСсСриализации, доступны ΠΊΠ°ΠΊ Π½Π° сторонС сСрвСра, Ρ‚Π°ΠΊ ΠΈ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ всСх Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… классов Π² JAR-Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅Π³ΠΎ вмСстС с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим процСсс сСриализации ΠΈ дСсСриализации поэтапно:

БСриализация:

  1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠΎ сСти, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ экзСмпляром класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Serializable.

  2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π°: Π’Ρ‹ создаСтС ObjectOutputStream, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π²Ρ‹Π²ΠΎΠ΄Π°, способным Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Java Π² ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ².

  3. Π—Π°ΠΏΠΈΡΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: Π’Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ writeObject() Π½Π° вашСм ObjectOutputStream, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΏΠΎΡ‚ΠΎΠΊ.

ДСсСриализация:

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π°: Π’Ρ‹ создаСтС ObjectInputStream, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π²Π²ΠΎΠ΄Π°, способным Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Java ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ².

  2. Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: Π’Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ readObject() Π½Π° вашСм ObjectInputStream, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°.

  3. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Object, поэтому Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ привСсти Π΅Π³ΠΎ ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΏΠ΅Ρ€Π΅Π΄ использованиСм.

Π’ΠΎ врСмя дСсСриализации Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ классС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (имя класса ΠΈ serialVersionUID), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ этого класса. Если класс нСдоступСн, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassNotFoundException.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой ошибки, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ классы доступны ΠΊΠ°ΠΊ Π½Π° сторонС сСрвСра, Ρ‚Π°ΠΊ ΠΈ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

ΠŸΡ€ΠΈ сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Java ΠΌΠ΅Ρ‚ΠΎΠ΄ writeObject() класса ObjectOutputStream Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ структуру ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ сСриализуСт Π΅Π³ΠΎ Π² соотвСтствии с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это происходит:

  1. Поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: ObjectOutputStream сСриализуСт всС нСстатичСскиС ΠΈ Π½Π΅ Ρ‚Ρ€Π°Π½Π·ΠΈΠ΅Π½Ρ‚Π½Ρ‹Π΅ поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Ρ€Π°Π½Π·ΠΈΠ΅Π½Ρ‚Π½Ρ‹Π΅ поля (ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом transient) ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΈΠ· сСриализации.

  2. Поля супСркласса: Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ наслСдуСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса, ObjectOutputStream Ρ‚Π°ΠΊΠΆΠ΅ сСриализуСт всС нСстатичСскиС ΠΈ Π½Π΅ Ρ‚Ρ€Π°Π½Π·ΠΈΠ΅Π½Ρ‚Π½Ρ‹Π΅ поля супСркласса.

  3. Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹: Если Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ObjectOutputStream рСкурсивно сСриализуСт ΠΈΡ….

  4. БтатичСскиС поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: ObjectOutputStream Π½Π΅ сСриализуСт статичСскиС поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ классу, Π° Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

  5. ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅: ObjectOutputStream Ρ‚Π°ΠΊΠΆΠ΅ сохраняСт ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ классС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΅Π³ΠΎ имя класса ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ serialVersionUID. Π­Ρ‚Π° мСтаинформация позволяСт дСсСриализатору ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π²ΠΎΡΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ².

ΠŸΡ€ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ObjectInputStream ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ структуру Π±Π°ΠΉΡ‚ΠΎΠ² для воссоздания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² памяти.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ObjectOutputStream "ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚", ΠΊΠ°ΠΊ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡƒΡ‚Π΅ΠΌ ΠΎΠ±Ρ…ΠΎΠ΄Π° Π΅Π³ΠΎ структуры ΠΈ сСриализации ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поля, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈ сохранСния ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ классС. Π­Ρ‚ΠΎΡ‚ процСсс автоматичСский ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ минимального Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° программиста.

Вопросы ΠΎΡ‚ мСня

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²ΠΎΡ‚ нСсколько вопросов ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ‚Π΅ΠΌ:

Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ взаимодСйствиС:

  1. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ модСлью OSI ΠΈ модСлью TCP/IP. КакиС прСимущСства ΠΈ нСдостатки ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ?
  2. Π§Π΅ΠΌ TCP отличаСтся ΠΎΡ‚ UDP? Как Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ прилоТСния?
  3. КакиС основныС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅? ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ΠΈΡ… сходства ΠΈ различия.
  4. Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°? КакиС прСимущСства ΠΎΠ½Π° прСдоставляСт?
  5. КакиС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² сСти? Как ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ€Ρ‹ бСзопасности ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚?

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP ΠΈ классы Socket ΠΈ ServerSocket:

  1. КакиС особСнности ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° TCP Π΄Π΅Π»Π°ΡŽΡ‚ Π΅Π³ΠΎ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…?
  2. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ клиСнтскоС соСдинСниС с использованиСм класса Socket? КакиС этапы соСдинСния происходят Π·Π° кулисами?
  3. КакиС прСимущСства прСдоставляСт ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ использовании ServerSocket для мноТСства ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²?
  4. Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ-Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с классами Socket ΠΈ ServerSocket?
  5. Как ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки сокСтов ΠΈ сСрвСрных сокСтов? КакиС стратСгии ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ устойчивости ΠΈ отказоустойчивости прилоТСния?

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UDP ΠΈ классы DatagramSocket ΠΈ DatagramPacket:

  1. Π’ Ρ‡Π΅ΠΌ основноС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° UDP? КакиС Ρ‚ΠΈΠΏΡ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ UDP вмСсто TCP?
  2. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ UDP-соСдинСниС с использованиСм классов DatagramSocket ΠΈ DatagramPacket? КакиС этапы Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для установлСния соСдинСния?
  3. Как ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ использовании ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° UDP? КакиС ΠΌΠ΅Ρ€Ρ‹ бСзопасности слСдуСт ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ?
  4. Какая информация содСрТится Π² DatagramPacket? Как эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра?
  5. Как ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ использовании UDP? КакиС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этого?

ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°:

  1. Π§Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ отличаСтся ΠΎΡ‚ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ? КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… прилоТСниях?
  2. КакиС прСимущСства прСдоставляСт Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄? КакиС сцСнарии использования Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходят для Π½Π΅Π³ΠΎ?
  3. Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСлСкторов Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Π²Π²ΠΎΠ΄Π΅-Π²Ρ‹Π²ΠΎΠ΄Π΅? КакиС события ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ отслСТСны с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСлСкторов?
  4. КакиС основныС классы ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ Π² Java? Как ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для асинхронного Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ…?
  5. КакиС нСдостатки Π΅ΡΡ‚ΡŒ Ρƒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°? КакиС стратСгии ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ?

Π Π°Π±ΠΎΡ‚Π° с сСтСвыми ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ ΠΈ классы SocketChannel ΠΈ DatagramChannel:

  1. КакиС особСнности ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ сСтСвыС ΠΊΠ°Π½Π°Π»Ρ‹ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ классами сокСтов?
  2. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСтСвой ΠΊΠ°Π½Π°Π» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса SocketChannel? Π’ Ρ‡Π΅ΠΌ прСимущСства этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅Π΄ классом Socket?
  3. Как Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с UDP-сСтСвыми ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ с использованиСм класса DatagramChannel? КакиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ½ прСдоставляСт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с DatagramSocket?
  4. Как ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСтСвыми ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ? Как ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ события Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€ΠΈ использовании сСлСкторов?
  5. КакиС особСнности обСспСчиваСт класс AsynchronousChannel? Π’ Ρ‡Π΅ΠΌ Π΅Π³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ классов SocketChannel ΠΈ DatagramChannel?

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти ΠΈ сСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²:

  1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π° ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти?
  2. КакиС классы Π² Java ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сСриализации ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²? КакиС интСрфСйсы ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚?
  3. КакиС ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²? КакиС ΠΌΠ΅Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ для ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ?
  4. Как ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ сСриализованныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ сСти с использованиСм классов Socket ΠΈ ServerSocket?
  5. КакиС срСдства прСдоставляСт Java для обСспСчСния бСзопасности ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ сСриализованных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎ сСти? Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти срСдства Π² своСм ΠΊΠΎΠ΄Π΅?

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Serializable ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ Π³Ρ€Π°Ρ„ΠΎΠΌ:

  1. Π§Ρ‚ΠΎ прСдставляСт собой интСрфСйс Serializable? КакиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ½ содСрТит ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ трСбования ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΊ классам?
  2. КакиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ прСдоставляСт Java для сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π³Ρ€Π°Ρ„Π°? КакиС особСнности слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ сСриализации слоТных структур Π΄Π°Π½Π½Ρ‹Ρ…?
  3. КакиС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ способы сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Java? КакиС прСимущСства ΠΈ нСдостатки Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…?
  4. КакиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŽ процСсса сСриализации ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²? Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ процСсса?
  5. Как ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²? КакиС ΠΌΠ΅Ρ€Ρ‹ прСдостороТности слСдуСт ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ?

Java Stream API:

  1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Java Stream API ΠΈ ΠΊΠ°ΠΊΠΎΠ²Π° Π΅Π³ΠΎ Ρ†Π΅Π»ΡŒ? КакиС прСимущСства ΠΎΠ½ прСдоставляСт ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с коллСкциями Π΄Π°Π½Π½Ρ‹Ρ…?
  2. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ (pipeline) с использованиСм Java Stream API? КакиС этапы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€?
  3. КакиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ относятся ΠΊ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ, Π° ΠΊΠ°ΠΊΠΈΠ΅ ΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Π² Java Stream API? Каково ΠΈΡ… Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°?
  4. КакиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ прСдоставляСт Java Stream API для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ, прСобразования ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…? Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² своСм ΠΊΠΎΠ΄Π΅?
  5. Как ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ эффСктивноС использованиС Java Stream API ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими объСмами Π΄Π°Π½Π½Ρ‹Ρ…? КакиС стратСгии ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ?

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования:

  1. Какой шаблон проСктирования ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π΅Π· указания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ класса создаваСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°? КакиС прСимущСства ΠΈ нСдостатки Ρƒ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°?
  2. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ шаблон проСктирования Decorator? КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΎΠ½ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΠ½ содСрТит?
  3. Π’ Ρ‡Π΅ΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ шаблон проСктирования Factory Method? КакиС прСимущСства ΠΎΠ½ прСдоставляСт Π² сравнСнии с созданиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ?
  4. Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ шаблон проСктирования Command? КакиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя этот шаблон ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ½ Ρ€Π΅ΡˆΠ°Π΅Ρ‚?
  5. Π§Ρ‚ΠΎ прСдставляСт собой шаблон проСктирования Singleton? Как ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этого шаблона с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ многопоточности?

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования:

  1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ шаблон проСктирования Flyweight? КакиС прСимущСства ΠΎΠ½ прСдоставляСт ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими объСмами Π΄Π°Π½Π½Ρ‹Ρ…?
  2. Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ шаблон проСктирования Interpreter? Π’ ΠΊΠ°ΠΊΠΈΡ… случаях ΠΎΠ½ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ примСнСния этого шаблона ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚?
  3. КакиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ шаблон проСктирования Strategy? КакиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя этот шаблон ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ собой?
  4. Π’ Ρ‡Π΅ΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ шаблон проСктирования Adapter? КакиС классы ΠΈ интСрфСйсы Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя этот шаблон ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚?
  5. Какой шаблон проСктирования ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания простого интСрфСйса для слоТной подсистСмы? Как этот шаблон ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ взаимодСйствиС с подсистСмой?

Releases

No releases published

Packages

No packages published

Languages