Bridge — это
Простыми словами:
▪️ Пример:
// Реализация — «как доставить»
interface MessageSender {
void send(String message, String recipient);
}
class EmailSender implements MessageSender {
public void send(String message, String recipient) {
System.out.println("Email → " + recipient + ": " + message);
}
}
class SmsSender implements MessageSender {
public void send(String message, String recipient) {
System.out.println("SMS → " + recipient + ": " + message);
}
}
// Абстракция — «что отправить»
abstract class Notification {
protected MessageSender sender; // мост к реализации
public Notification(MessageSender sender) {
this.sender = sender;
}
abstract void notify(String recipient, String message);
}
class UrgentNotification extends Notification {
public UrgentNotification(MessageSender sender) {
super(sender);
}
void notify(String recipient, String message) {
sender.send("[СРОЧНО] " + message, recipient);
sender.send("[СРОЧНО] Повторное напоминание: " + message, recipient);
}
}
class RegularNotification extends Notification {
public RegularNotification(MessageSender sender) {
super(sender);
}
void notify(String recipient, String message) {
sender.send(message, recipient);
}
}
// Использование — любая комбинация
Notification urgentSms = new UrgentNotification(new SmsSender());
urgentSms.notify("+79991234567", "Сервер упал");
Notification regularEmail = new RegularNotification(new EmailSender());
regularEmail.notify("dev@company.com", "Деплой завершён");
▪️ Когда использовать
—
—
—
▪️ Bridge vs Strategy
— Strategy:
— Bridge:
▪️ Минус
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥1
Composite — это
Простыми словами:
▪️ Пример:
// Общий интерфейс
interface OrganizationUnit {
String getName();
long getSalary();
}
// Лист — отдельный сотрудник
class Employee implements OrganizationUnit {
private final String name;
private final long salary;
public Employee(String name, long salary) {
this.name = name;
this.salary = salary;
}
public String getName() { return name; }
public long getSalary() { return salary; }
}
// Композит — отдел, содержит другие элементы
class Department implements OrganizationUnit {
private final String name;
private final List<OrganizationUnit> units = new ArrayList<>();
public Department(String name) {
this.name = name;
}
public void add(OrganizationUnit unit) {
units.add(unit);
}
public String getName() { return name; }
public long getSalary() {
return units.stream()
.mapToLong(OrganizationUnit::getSalary)
.sum();
}
}
// Использование
Department dev = new Department("Разработка");
dev.add(new Employee("Анна", 200_000));
dev.add(new Employee("Борис", 180_000));
Department company = new Department("Компания");
company.add(dev);
company.add(new Employee("CEO Иван", 500_000));
System.out.println(company.getSalary()); // 880000
▪️ Когда использовать
—
—
▪️ Минус
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🔥1
Decorator — это
▪️ Пример:
// Базовый интерфейс
interface DataService {
String getData(String key);
}
// Базовая реализация
class DatabaseService implements DataService {
public String getData(String key) {
return "data_from_db_" + key; // запрос в БД
}
}
// Абстрактный декоратор
abstract class DataServiceDecorator implements DataService {
protected final DataService delegate;
public DataServiceDecorator(DataService delegate) {
this.delegate = delegate;
}
}
// Декоратор логирования
class LoggingDecorator extends DataServiceDecorator {
public LoggingDecorator(DataService delegate) {
super(delegate);
}
public String getData(String key) {
System.out.println("LOG: запрос ключа " + key);
String result = delegate.getData(key);
System.out.println("LOG: получен результат");
return result;
}
}
// Декоратор кэширования
class CachingDecorator extends DataServiceDecorator {
private final Map<String, String> cache = new HashMap<>();
public CachingDecorator(DataService delegate) {
super(delegate);
}
public String getData(String key) {
return cache.computeIfAbsent(key, delegate::getData);
}
}
// Использование — собираем как конструктор
DataService service = new CachingDecorator(
new LoggingDecorator(
new DatabaseService()
)
);
service.getData("user:42"); // лог + БД + кэш
service.getData("user:42"); // кэш (без лога и БД)
▪️ Когда использовать
—
—
—
▪️ Decorator vs наследование
— Наследование:
— Decorator:
▪️ Минус
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🔥1
Добавили объект в Set. Он там. Но найти его невозможно. Утечка памяти в проде. Почему?
📦 Задание — code review
Команда хранит активные сессии в HashSet. После смены роли пользователя сессия «пропадает» из множества — contains() возвращает false, remove() не удаляет. Set растёт, память течёт.
public class UserSession {
private Long userId;
private String role;
public UserSession(Long userId, String role) {
this.userId = userId;
this.role = role;
}
// getters, setters
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserSession that = (UserSession) o;
return Objects.equals(userId, that.userId)
&& Objects.equals(role, that.role);
}
@Override
public int hashCode() {
return Objects.hash(userId, role);
}
}
@Service
public class SessionManager {
private final Set<UserSession> activeSessions = new HashSet<>();
public void addSession(UserSession session) {
activeSessions.add(session);
}
public void promoteToAdmin(Long userId) {
activeSessions.stream()
.filter(s -> s.getUserId().equals(userId))
.findFirst()
.ifPresent(s -> s.setRole("ADMIN"));
}
public boolean isActive(UserSession session) {
return activeSessions.contains(session);
}
public void removeSession(UserSession session) {
activeSessions.remove(session);
}
}// Сценарий бага:
sessionManager.addSession(new UserSession(1L, "USER")); // ОК
sessionManager.promoteToAdmin(1L); // меняем роль
sessionManager.isActive(new UserSession(1L, "ADMIN")); // false ?!
// объект внутри Set есть, но достать его нельзя
▪️ Почему после promoteToAdmin() сессия становится невидимой для contains() и remove()?
▪️ Как исправить, не ломая бизнес-логику?
Ставьте → 🔥, если нравится формат. Если нет → 🌚
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍3❤1👏1
Как часто вы проходите собеседования?
🔥 — Сейчас активно ищу работу
👍🏼 — Раз в несколько месяцев
❤️ — Раз в полгода-год
😁 — Не прохожу, уже работаю/ещё учусь
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15😁11👍2❤1