Modèle de conception composite
Salut les gars !!!!!!
Dans une base de code aujourd'hui, de nombreux modèles de conception sont utilisés, nous avons donc essayé d'en saisir un, appelé "Composite".
Introduction
L'un des modèles de conception structurelle bien connus est le composite. Il crée des objets à l'aide d'une seule interface. Il utilise largement le polymorphisme et une structure arborescente composée de nœuds discrets ou de minuscules composants qui ont tous une interface commune. Nous pouvons simplement construire une structure plus sophistiquée à partir de petits composants.
Un modèle de conception enfichable comprend également des modèles composites.
SCHÉMA — STRUCTURE
Extraits de code
Éléments de base
Composant : interface standard adoptée par chaque nœud de l'arborescence.
Primitif (Feuille) : C'est un élément autonome et n'a pas de progéniture.
Composite : c'est un conteneur pour plusieurs composants de feuille.
Passons rapidement en revue la situation dans l'étude de cas.
Premier jour du projet : supposons que vous travaillez sur un projet qui a une fonctionnalité ou un module simple, comme la possibilité de télécharger des fichiers sur Google Drive.
Un scénario vraiment simple, il suffit donc de revoir le code ci-dessous.
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.
}
}
}
Bonjour, Devs De nombreux clients du client souhaitent modifier la procédure de téléchargement de fichiers. Les options Google Drive et Amazon S3 nécessitent un processus de téléchargement.
Les développeurs ont assuré au client qu'il n'y avait aucun problème. Nous le ferons et vous informerons dès que possible
Changez quelques lignes de code dans Xcode, et hop ! Il fonctionne bien.
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
}
}
}
Cependant, l'histoire ne s'arrête pas là. Après plus de deux semaines , le client est revenu et a demandé que d'autres alternatives de stockage, telles que Dropbox, soient incluses.
Et tout le monde sait bien comment le développeur va réagir cette fois. Les développeurs pensent toujours que ce sera le dernier changement avant de se mettre au travail.
Dans Xcode, écrivez du code, puis testez-le.
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
}
}
}
Notez qu'à chaque fois, les développeurs ont violé le principe Open-Close , ce qui est mauvais pour le processus de développement.
Et encore une fois, le client a une nouvelle demande, et cette fois, les développeurs ont choisi de remodeler complètement en utilisant le bon motif avant de commencer avec le 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/
Si vous avez des questions ou des commentaires, veuillez les poster ci-dessous. J'adorerais avoir de vos nouvelles.
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































