Добавление классов
создаем Spotify похожий класс яндекса - стриминговый сервис, позволяющий легально прослушивать музыкальные композиции, аудиокниги и подкасты, не скачивая их
class SpotifyApi {
findAll();
}
создаем VK похожий класс яндекса
class VKMusicApi{
query(){}
}
общую функциональность интерфейса мы не выносим
нам нужно менять создание соответствующих класса
нам нужно менять вызов соответствующих методов
const MusicApp=()=>{
const API = new SpotifyApi()
API.findAll()
}
Мы решаем
одинаковые названия методов
получаем возможность заниматься полиморфизмом
- создать общий интерфейс
- добавляем метод getTracks в интерфейс
- гиплементируем этот интерфейс в каждый класс
interface MusicApi{
getTracks: () => void;
}
class YandexMusicApi implements MusicApi{
getTracks: () => void {}
}
class SpotifyApi implements MusicApi{
getTracks: () => void {}
}
class VKMusicApi implements MusicApi{
getTracks: () => void {}
}
Если в определенном количестве разных файлов используем SpotifyApi и вдруг мы решили использовать YandexMusic
менять придётся руками
const MusicApp = () => {
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
const API: MusicApi = SpotifyApi.getIntance()
...
API.getTracks()
}
Создание абстракции.
Звено между клиентом и различными видами Api для получения музыки
class MusicClient implements MusicApi {
через конструктор мы получаем соответствующий клиент
yandex,spotify,VK
client: MusicApi;
constructor(client: MusicApi){
this.client=client;
}
getTracks(){
делегируем вызова метода соответcвующему Api
this.client.getTracks();
}
}
const MusicApp=()=>{
все взаимодействие с api мы ведем через музыкальный клиент
нам абсолютно все равно получаем мы музыку с yandex,spotify,VK
но в любой момент мы это поведение можем изменить и при этом сделать это только в одном месте
const API: MusicApi = new MusicClient(new SpotifyApi())
API.getTracks()
}