Padrão de design 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ê.





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)