Modello di progettazione composita
Hey ragazzi !!!!!!
In una base di codice oggi vengono utilizzati numerosi modelli di progettazione, quindi abbiamo cercato di coglierne uno, chiamato "Composito".
introduzione
Uno dei ben noti modelli di progettazione strutturale è il composito. Crea oggetti utilizzando un'unica interfaccia. Utilizza ampiamente il polimorfismo e una struttura ad albero composta da nodi discreti o minuscoli componenti che hanno tutti un'interfaccia comune. Possiamo semplicemente costruire una struttura più sofisticata con piccoli componenti.
Un modello di progettazione collegabile include anche modelli compositi.
DIAGRAMMA — STRUTTURA
Frammenti di codice
Elementi fondamentali
Componente: un'interfaccia standard che ogni nodo dell'albero ha adottato.
Primitivo (foglia): è un oggetto autonomo e non ha prole.
Composito: è un contenitore per diversi componenti fogliari.
Rivediamo rapidamente la situazione nel Case Study.
Primo giorno del progetto: supponiamo che tu stia lavorando a un progetto che ha una funzione o un modulo semplice, come la possibilità di caricare file su Google Drive.
Uno scenario davvero semplice, quindi basta rivedere il codice qui sotto.
struct File {
var name: String
var data: Data
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
/// Problem On Day 1
func finishedCreateFileProcess(file: File) {
uploadToGoogleDrive(file: File(name: "test", data: Data()))
}
func uploadToGoogleDrive(file: File) {
// Code to upload to Google Drive.
}
}
}
Ciao, Devs Numerosi clienti del client desiderano modificare la procedura di caricamento dei file. Le opzioni Google Drive e Amazon S3 richiedono un processo di caricamento.
Gli sviluppatori hanno assicurato al cliente che non c'erano problemi. Lo faremo e ti faremo sapere il prima possibile
Modifica alcune righe di codice in Xcode e presto! Funziona senza intoppi.
struct File {
var name: String
var data: Data
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
/// Two Weeks Later
func finishedCreateFileProcess(file: File, shouldUploadToGD: Bool) {
if shouldUploadToGD {
uploadToGoogleDrive(file: File(name: "test", data: Data()))
} else {
uploadToAmazons3(file: File(name: "test", data: Data()))
}
}
func uploadToGoogleDrive(file: File) {
// Code to upload to Google Drive.
}
func uploadToAmazons3(file: File) {
// Code to upload to Amazon S3
}
}
}
Tuttavia, la storia non finisce qui. Dopo più di due settimane , il cliente è tornato e ha richiesto l'inclusione di ulteriori alternative di archiviazione, come Dropbox.
E tutti sanno bene come risponderà lo sviluppatore questa volta. Gli sviluppatori pensano ancora che sarà l'ultimo cambiamento prima di mettersi al lavoro.
In Xcode, scrivi il codice e poi provalo.
struct File {
var name: String
var data: Data
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
/// Four Weeks Later
enum StorageService: Int {
case googleDrive = 0
case amazonS3
case dropbox
}
func finishedCreateFileProcess(file: File, uploadTo service: StorageService) {
switch service {
case .googleDrive:
uploadToGoogleDrive(file: File(name: "test", data: Data()))
case .amazonS3:
uploadToAmazons3(file: File(name: "test", data: Data()))
case .dropbox:
uploadToDropBox(file: File(name: "test", data: Data()))
}
}
func uploadToGoogleDrive(file: File) {
// Code to upload to Google Drive.
}
func uploadToAmazons3(file: File) {
// Code to upload to Amazon S3
}
func uploadToDropBox(file: File) {
// Code to upload to DropBox
}
}
}
Tieni presente che ogni volta gli sviluppatori hanno violato il principio Open-Close , il che è dannoso per il processo di sviluppo.
E ancora una volta, il cliente ha una nuova richiesta e questa volta gli sviluppatori hanno scelto di rimodellare completamente utilizzando il modello giusto prima di iniziare con composite .
//
// UseCase1.swift
// CompositeDesignPattern
//
// Created by Nikunj Modi on 30/01/23.
//
import Foundation
protocol StorageService {
func upload()
}
class GoogleDriveStorage: StorageService {
func upload() {
// Here is the need to implement business logic.
print("GoogleDriveStorage")
}
}
class DropBoxStorage: StorageService {
func upload() {
// Here is the need to implement business logic.
print("DropBoxStorage")
}
}
class AmazonS3Storage: StorageService {
func upload() {
// Here is the need to implement business logic.
print("AmazonS3Storage")
}
}
class StorageComposite: StorageService {
let service: [StorageService]
init(services: [StorageService]) {
self.service = services
}
func upload() {
print("StorageComposite")
for service in service {
service.upload()
}
}
}
class ExampleViewModel {
let service: StorageService
init(service: StorageService) {
self.service = service
}
func finishedCreatingFile(file: File) {
self.service.upload()
}
}
struct File {
var name: String
var data: Data
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let vm = ExampleViewModel(service: StorageComposite(services: [
GoogleDriveStorage(),
AmazonS3Storage(),
DropBoxStorage()
]))
vm.finishedCreatingFile(file: File(name: "test", data: Data()))
}
}
https://theniks.github.io/Portfolio/
Se hai domande o commenti, ti preghiamo di pubblicarli qui sotto. Mi piacerebbe sentirti.

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































