Padrão de design composto

Feb 04 2023
Ei pessoal !!!!!! Em uma base de código hoje, vários padrões de design são usados, então tentamos entender um deles, chamado “Composite”. Introdução Um dos padrões de projeto estrutural mais conhecidos é o composto.

Ei pessoal !!!!!!

Em uma base de código hoje, vários padrões de design são usados, então tentamos entender um deles, chamado “Composite”.

Introdução

Um dos padrões de design estrutural mais conhecidos é o composto. Ele cria objetos usando uma única interface. Ele usa extensivamente o polimorfismo e uma estrutura de árvore composta de nós discretos ou componentes minúsculos que possuem uma interface comum. Podemos simplesmente construir uma estrutura mais sofisticada a partir de pequenos componentes.

Um padrão de projeto conectável também inclui padrões compostos.

DIAGRAMA - ESTRUTURA

Partes de codigo

Elementos principais

Componente: Uma interface padrão que cada nó na árvore adotou.

Primitivo(Folha): É um item autônomo e não tem descendência.

Composto: É um recipiente para vários componentes da folha.

Vamos rever rapidamente a situação no Estudo de Caso.

Primeiro dia do projeto: digamos que você esteja trabalhando em um projeto que tenha um recurso ou módulo simples, como a capacidade de fazer upload de arquivos para o Google Drive.

Um cenário realmente simples, então apenas revise o código abaixo.

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

Olá, Devs Numerosos clientes do cliente desejam modificar o procedimento de upload de arquivo. As opções Google Drive e Amazon S3 requerem um processo de upload.

Os desenvolvedores garantiram ao cliente que não havia problema. Faremos isso e avisaremos assim que pudermos

Altere algumas linhas de código no Xcode e pronto! Funciona sem problemas.

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

No entanto, a história não termina aqui. Após mais de duas semanas , o cliente retornou e solicitou a inclusão de outras alternativas de armazenamento, como o Dropbox.

E todos estão cientes de como o desenvolvedor responderá desta vez. Os desenvolvedores ainda acham que essa será a mudança final antes de começarem a trabalhar.

No Xcode, escreva o código e teste-o.

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

Observe que, todas as vezes, os desenvolvedores violaram o princípio Open-Close , o que é ruim para o processo de desenvolvimento.

E mais uma vez, o cliente tem uma nova demanda e, desta vez, os desenvolvedores optaram por remodelar completamente usando o padrão certo antes de começar com o 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 você tiver quaisquer perguntas ou comentários, por favor, poste-os abaixo. Eu adoraria ouvir de você.