Skip to content

Instantly share code, notes, and snippets.

@alexkonst
Created May 1, 2025 20:08
Show Gist options
  • Save alexkonst/599156c4f2d5263c816f23001c9d43c2 to your computer and use it in GitHub Desktop.
Save alexkonst/599156c4f2d5263c816f23001c9d43c2 to your computer and use it in GitHub Desktop.
TS homework 4
// #### Паттерн Композиция — Система умного дома
// Создайте систему управления умным домом, использующую паттерн Композиция
// для управления различными устройствами (например, свет, термостат).
// Реализуйте класс SmartHome, который содержит коллекцию устройств и предоставляет методы
// для их массового включения, выключения и получения статуса.
// Каждое устройство должно реализовать интерфейс с методами включения, выключения и получения статуса.
// Требования:
// * Используйте композицию для управления набором устройств.
// * Обеспечьте добавление новых типов устройств без изменения кода SmartHome.
// * Реализуйте инкапсуляцию данных в классах устройств.
// PS: реализация важна с точки зрения типов. Фактическую реализацию можно не делать.
enum SwitchState {
On,
Off
}
interface Switchable {
status: SwitchState
switchOn(): void
switchOff(): void
}
class Device implements Switchable {
status: SwitchState = SwitchState.Off
switchOn(): void {
this.status = SwitchState.On
}
switchOff(): void {
this.status = SwitchState.Off
}
}
class SmartHome {
devices: Device[] = []
add(device: Device): void {}
remove(device: Device): void {}
getStatus(): SwitchState[] {
return this.devices.map(({status}) => status)
}
switchAllOn(): void {}
switchAllOff(): void {}
}
// #### Паттерн Слуга — Управление задачами
// Разработайте систему управления задачами в проекте, используя паттерн Слуга
// для выполнения операций над задачами (например, установка приоритета, завершение задачи).
// Создайте класс Task с приватными полями (идентификатор, описание, статус, приоритет)
// и класс TaskServant, который выполняет операции над задачами, такие как изменение статуса или приоритета.
// Требования:
// * Реализуйте TaskServant как слугу, выполняющего операции над объектами Task.
// * Обеспечьте возможность массовой обработки задач (например, завершение всех задач с определенным приоритетом).
// * Используйте инкапсуляцию для защиты данных задачи.
// PS: реализация важна с точки зрения типов. Фактическую реализацию можно не делать.
enum Status {
Open,
InProgress,
Ready,
Closed
}
enum Priority {
Low,
Medium,
High
}
class Task {
constructor(private id: string, private description: string, private status: Status, private priority: Priority) {}
}
class TaskServant {
tasks: Task[] = []
updatePriority(newPriority: Priority): void {}
updateStatus(newStatus: Status): void {}
}
// #### Паттерн Стратегия — Система уведомлений
// Создайте систему отправки уведомлений, используя паттерн Стратегия
// для реализации различных способов доставки (например, email, SMS, push).
// Реализуйте интерфейс стратегии уведомлений и класс NotificationService,
// который использует выбранную стратегию для отправки сообщений.
// Предусмотрите возможность динамической смены стратегии.
// Требования:
// * Реализуйте динамическую смену стратегии уведомлений.
// * Каждая стратегия должна возвращать строку с информацией об отправке уведомления.
// * Добавьте проверку на непустое сообщение перед отправкой.
// PS: реализация важна с точки зрения типов. Фактическую реализацию можно не делать.
enum DeliveryKind {
Email,
SMS,
Push
}
abstract class DeliveryStrategy implements DeliveryStrategy {
constructor(private kind: DeliveryKind) {}
send(message: string): string {
return `Delivered via ${this.kind}`
}
}
class NotificationService {
constructor(public deliveryStrategy: DeliveryStrategy) {}
changeStrategy(strategy: DeliveryStrategy) {
this.deliveryStrategy = strategy
}
notify(message: string): void {
if (message.length === 0) {
return
}
const result = this.deliveryStrategy.send(message)
console.log(result)
}
}
// #### Паттерн Мост — Система рендеринга графики
// Разработайте систему рендеринга графических объектов, используя паттерн Мост для разделения абстракции рендеринга и способа вывода (например, SVG, Canvas). Создайте абстрактный класс Renderer и интерфейс RenderImplementation. Реализуйте два типа рендеринга: простой (отрисовка базовых фигур) и детализированный (отрисовка с эффектами).
// Требования:
// * Реализуйте мост между абстракцией рендеринга и реализацией вывода.
// * Детализированный рендеринг должен добавлять дополнительные параметры (например, тень или градиент).
// * Обеспечьте возможность смены реализации без изменения клиентского кода.
// PS: реализация важна с точки зрения типов. Фактическую реализацию можно не делать.
// #### Дружественный класс — Система управления доступом
// Создайте систему управления доступом, где класс Employee предоставляет доступ к своим приватным данным (например, идентификатор, уровень доступа) дружественному классу AccessManager. Реализуйте функционал проверки прав доступа и изменения уровня доступа сотрудника.
// Требования:
// * Обеспечьте доступ AccessManager к приватным данным Employee.
// * Реализуйте метод проверки, возвращающий, имеет ли сотрудник доступ к определенному ресурсу.
// * Реализуйте метод изменения уровня доступа с проверкой текущих прав.
// PS: реализация важна с точки зрения типов. Фактическую реализацию можно не делать.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment