Modello di progettazione composita

Feb 04 2023
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.

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.