@startuml

class Catalog {
    - docs[]
    - source
    + __construct($source)
    + editDoc($idDoc)
    + createDocuments()
}

class Document {
    - source 
    - resources[]
    - idDoc
    - keywords[]
    - nameDocument
    + __construct($idDoc, $source, $observer)
    + createResource()
    + addKeyWord($keyWord)
    + getIdDoc()
    + getUnicalName()
}

abstract class Element {
    # observer
    + notify()
    + changeContent()
    + setObserver($observer)
    + deleteObserver()
}

class Resource {
    - tag
    + __construct($tag, $observer) 
    + getUnicalName()
}

class ElementObserver {
    - subscriptions
    + execute($element, $textNotification, $event)
    + send($user, $text)
}

interface Observer {
    + execute($element, $textNotification)
}

class Subscriptions {
    - subscriptions[]
    + foundSubscription($changeElement)
}

class Subscription {
    - element
    - user 
    - changeLog | Хранит массив где ключи номер оповещения подписки
    + __construct($user, $element)
    + getElement()
    + getUser()
}

class User {
    - login
    + __construct($login)
    + getLogin()
}

class DocumentAdapter {
    + getDocuments($source)
}

class ResourceAdapter {
    + getResource($source)
}

Catalog o-- Document
Document <|-- Element
Resource <|-- Element
Resource o-- ElementObserver
Document o-- ResourceAdapter
Catalog o-- DocumentAdapter
Document o-- Resource
Document o-- ElementObserver
ElementObserver <|-- Observer
Subscriptions o-- Subscription
Subscription o-- User
Subscription o-- Resource
Subscription o-- Document

@enduml
