Pola Desain Komposit

Feb 04 2023
Hai teman-teman !!!!!! Dalam basis kode saat ini, banyak pola desain digunakan, jadi kami mencoba memahami salah satunya, yang disebut "Komposit". Pendahuluan Salah satu pola desain struktural yang terkenal adalah komposit.

Hai teman-teman !!!!!!

Dalam basis kode saat ini, banyak pola desain digunakan, jadi kami mencoba memahami salah satunya, yang disebut "Komposit".

Perkenalan

Salah satu pola desain struktural yang terkenal adalah komposit. Itu menciptakan objek menggunakan satu antarmuka. Ini secara ekstensif menggunakan polimorfisme dan struktur pohon yang terdiri dari node diskrit atau komponen kecil yang semuanya memiliki antarmuka yang sama. Kami hanya dapat membangun struktur yang lebih canggih dari komponen kecil.

Pola desain pluggable juga mencakup pola komposit.

DIAGRAM — STRUKTUR

Cuplikan Kode

Elemen Inti

Komponen: Antarmuka standar yang telah diadopsi oleh setiap node di pohon.

Primitif (Leaf): Ini adalah item otonom dan tidak memiliki keturunan.

Komposit: Ini adalah wadah untuk beberapa komponen daun.

Mari kita tinjau situasi dengan cepat di Studi Kasus.

Hari pertama proyek: Katakanlah Anda sedang mengerjakan proyek yang memiliki fitur atau modul langsung, seperti kemampuan mengunggah file ke Google Drive.

Skenario yang sangat mudah, jadi tinjau saja kode di bawah ini.

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

Halo, Pengembang Banyak klien dari klien yang ingin mengubah prosedur pengunggahan file. Opsi Google Drive dan Amazon S3 memerlukan proses pengunggahan.

Pengembang meyakinkan klien bahwa tidak ada masalah. Kami akan melakukannya dan memberi tahu Anda sesegera mungkin

Ubah beberapa baris kode di Xcode, dan presto! Ini berjalan lancar.

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

Namun, ceritanya tidak berakhir di sini. Setelah lebih dari dua minggu , klien kembali dan meminta agar alternatif penyimpanan lebih lanjut, seperti Dropbox, disertakan.

Dan semua orang sangat menyadari bagaimana pengembang akan merespons kali ini. Pengembang masih berpikir itu akan menjadi perubahan terakhir sebelum mereka mulai bekerja.

Di Xcode, tulis kode lalu uji.

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

Perhatikan bahwa setiap kali, pengembang melanggar Prinsip Buka-Tutup , yang berdampak buruk bagi proses pengembangan.

Dan sekali lagi, klien memiliki permintaan baru, dan kali ini, pengembang memilih untuk merombak sepenuhnya menggunakan pola yang tepat sebelum memulai dengan komposit .

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

Jika Anda memiliki pertanyaan atau komentar, silakan posting di bawah ini. Saya ingin mendengar dari Anda.