Zusammengesetztes Designmuster

Feb 04 2023
Hallo Leute !!!!!! In einer heutigen Codebasis werden zahlreiche Entwurfsmuster verwendet, daher haben wir versucht, eines davon namens „Composite“ zu erfassen. Einleitung Eines der bekanntesten strukturellen Entwurfsmuster ist der Verbundwerkstoff.

Hallo Leute !!!!!!

In einer heutigen Codebasis werden zahlreiche Entwurfsmuster verwendet, daher haben wir versucht, eines davon namens „Composite“ zu erfassen.

Einführung

Eines der bekanntesten strukturellen Entwurfsmuster ist der Verbundwerkstoff. Es erstellt Objekte über eine einzige Schnittstelle. Es verwendet in großem Umfang Polymorphismus und eine Baumstruktur, die aus diskreten Knoten oder winzigen Komponenten besteht, die alle über eine gemeinsame Schnittstelle verfügen. Wir können einfach eine komplexere Struktur aus kleinen Komponenten konstruieren.

Ein steckbares Entwurfsmuster umfasst auch zusammengesetzte Muster.

DIAGRAMM – STRUKTUR

Code Ausschnitte

Kernelemente _

Komponente: Eine Standardschnittstelle, die jeder Knoten im Baum übernommen hat.

Primitiv (Blatt): Es ist ein eigenständiger Gegenstand und hat keine Nachkommen.

Komposit: Es handelt sich um einen Behälter für mehrere Blattbestandteile.

Lassen Sie uns kurz die Situation in der Fallstudie überprüfen.

Der erste Tag des Projekts: Nehmen wir an, Sie arbeiten an einem Projekt, das über eine einfache Funktion oder ein einfaches Modul verfügt, beispielsweise die Möglichkeit, Dateien auf Google Drive hochzuladen.

Ein wirklich einfaches Szenario. Sehen Sie sich also einfach den folgenden Code an.

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.
        }
    }
}

Hallo Entwickler. Zahlreiche Kunden des Kunden möchten den Datei-Upload-Prozess ändern. Die Optionen Google Drive und Amazon S3 erfordern einen Upload-Vorgang.

Die Entwickler versicherten dem Kunden, dass es kein Problem gebe. Wir werden das tun und Ihnen so schnell wie möglich Bescheid geben

Ändern Sie ein paar Codezeilen in Xcode und schon! Es läuft reibungslos.

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
        }
    }
}

Die Geschichte endet hier jedoch nicht. Nach mehr als zwei Wochen meldete sich der Kunde zurück und forderte die Einbindung weiterer Speicheralternativen wie Dropbox.

Und jeder weiß genau, wie der Entwickler dieses Mal reagieren wird. Entwickler glauben immer noch, dass dies die letzte Änderung sein wird, bevor sie mit der Arbeit beginnen.

Schreiben Sie in Xcode Code und testen Sie ihn dann.

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
        }
    }
}

Beachten Sie, dass Entwickler jedes Mal gegen das Open-Close-Prinzip verstoßen haben , was sich negativ auf den Entwicklungsprozess auswirkt.

Und wieder einmal hat der Kunde eine neue Anforderung, und dieses Mal entschieden sich die Entwickler für eine vollständige Neugestaltung mit dem richtigen Muster, bevor sie mit Komposit beginnen .

//
//  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/

Wenn Sie Fragen oder Kommentare haben, posten Sie diese bitte unten. Ich würde mich freuen, von Ihnen zu hören.