Bayangkan membina set LEGO tanpa manual. Sudah tentu, anda mungkin berakhir dengan sesuatu yang samar-samar menyerupai kapal angkasa, tetapi kemungkinan besar, anda akan berakhir dengan timbunan huru-hara yang berwarna-warni. Dalam dunia pengekodan, corak reka bentuk adalah seperti manual LEGO itu—ia memberikan anda pelan tindakan yang terbukti untuk menyelesaikan masalah biasa, menjadikan kod anda lebih bersih, lebih cekap dan lebih mudah diselenggara.
Tetapi jangan risau, ini bukan kuliah kering tentang prinsip pengekodan. Anggap ia sebagai panduan kecil yang menyeronokkan untuk beberapa corak reka bentuk yang paling biasa dalam JavaScript, lengkap dengan analogi kehidupan sebenar yang menjadikan konsep ini mudah dihadam.
Corak Singleton memastikan bahawa kelas hanya mempunyai satu contoh dan menyediakan titik akses global kepadanya. Ia seperti mempunyai satu alat kawalan jauh untuk TV anda. Anda tidak memerlukan berbilang alat kawalan jauh untuk mengawal kelantangan, menukar saluran atau mematikannya—anda hanya memerlukan satu alat kawalan jauh itu.
Dalam JavaScript, corak ini biasanya digunakan untuk mengurus keadaan aplikasi global. Contohnya, jika anda mempunyai troli beli-belah di tapak web e-dagang, anda mahu semua komponen yang berinteraksi dengan troli (seperti menambah item, mengalih keluar item atau menyemak keluar) merujuk kepada contoh troli yang sama. Singleton memastikan bahawa semua tindakan ini mempengaruhi troli yang sama, bukan salinannya yang berbeza.
class ShoppingCart { constructor() { if (!ShoppingCart.instance) { this.items = []; ShoppingCart.instance = this; } return ShoppingCart.instance; } addItem(item) { this.items.push(item); } getItems() { return this.items; } } const cart1 = new ShoppingCart(); const cart2 = new ShoppingCart(); cart1.addItem('Laptop'); console.log(cart2.getItems()); // ['Laptop']
Corak Pemerhati adalah tentang memastikan objek sentiasa disegerakkan. Apabila satu objek berubah, yang lain perlu tahu mengenainya. Ia seperti sembang kumpulan di mana semua orang sentiasa dikemas kini tentang perkara yang berlaku. Jika seseorang menukar rancangan untuk hujung minggu, semua orang dalam kumpulan akan mendapat memo.
Dalam JavaScript, corak ini sering digunakan dalam sistem pengendalian acara. Katakan anda sedang membina apl media sosial. Apabila seseorang menyukai siaran, anda ingin mengemas kini kiraan suka, memberitahu pengarang siaran dan mungkin mencetuskan animasi. Corak Pemerhati membolehkan komponen berbeza ini kekal dikemas kini tanpa disambungkan secara langsung.
class Subject { constructor() { this.observers = []; } subscribe(observer) { this.observers.push(observer); } unsubscribe(observer) { this.observers = this.observers.filter(obs => obs !== observer); } notify(data) { this.observers.forEach(observer => observer.update(data)); } } class Observer { update(data) { console.log(`Observer received: ${data}`); } } const subject = new Subject(); const observer1 = new Observer(); const observer2 = new Observer(); subject.subscribe(observer1); subject.subscribe(observer2); subject.notify('New post liked!'); // Output: Observer received: New post liked! // Output: Observer received: New post liked!
Corak Kilang adalah mengenai mencipta objek tanpa menyatakan kelas objek yang tepat yang akan dibuat. Bayangkan pemotong biskut. Anda tidak tahu dengan tepat apa bentuk doh sehingga anda menekan pemotong ke bawah, tetapi anda tahu anda akan mendapat biskut.
Corak ini amat berguna apabila anda mempunyai koleksi objek yang berkongsi antara muka atau struktur yang sama tetapi mempunyai pelaksanaan asas yang berbeza. Contohnya, dalam permainan, anda mungkin mempunyai jenis musuh yang berbeza (zombie, vampire, serigala jadian), tetapi mereka semua berkongsi sifat yang sama seperti kesihatan, kelajuan dan kuasa serangan. Kilang boleh membantu anda mencipta musuh ini tanpa perlu risau tentang jenis tertentu.
class Enemy { constructor(type) { this.type = type; this.health = 100; } attack() { console.log(`${this.type} attacks with ${this.attackPower}`); } } class EnemyFactory { createEnemy(type) { let enemy; if (type === 'zombie') { enemy = new Enemy('Zombie'); enemy.attackPower = 10; } else if (type === 'vampire') { enemy = new Enemy('Vampire'); enemy.attackPower = 20; } else if (type === 'werewolf') { enemy = new Enemy('Werewolf'); enemy.attackPower = 30; } return enemy; } } const factory = new EnemyFactory(); const zombie = factory.createEnemy('zombie'); zombie.attack(); // Zombie attacks with 10 const vampire = factory.createEnemy('vampire'); vampire.attack(); // Vampire attacks with 20
Corak Modul adalah seperti mempunyai ruang kerja yang teratur di mana segala-galanya mempunyai tempatnya. Ia membantu anda memastikan bahagian berlainan kod anda teratur dan dikemas, menghalang ruang nama global daripada menjadi kucar-kacir.
Corak ini amat berguna dalam JavaScript untuk mencipta pembolehubah dan fungsi awam dan peribadi. Sebagai contoh, apabila anda membina perpustakaan atau pemalam, anda mungkin mahu mendedahkan kaedah tertentu kepada dunia luar sambil menyembunyikan yang lain. Corak Modul membolehkan anda berbuat demikian.
const Calculator = (function() { let result = 0; function add(x) { result += x; return result; } function subtract(x) { result -= x; return result; } function multiply(x) { result *= x; return result; } function divide(x) { if (x !== 0) { result /= x; return result; } else { console.error('Cannot divide by zero'); } } return { add, subtract, multiply, divide, getResult: () => result, }; })(); console.log(Calculator.add(10)); // 10 console.log(Calculator.subtract(2)); // 8 console.log(Calculator.multiply(3)); // 24 console.log(Calculator.divide(4)); // 6
Corak Penyesuai membenarkan antara muka yang tidak serasi berfungsi bersama. Anggap ia seperti penyesuai palam yang anda gunakan semasa melancong ke luar negara. Palam pengecas komputer riba anda mungkin tidak sesuai dengan soket dinding di negara lain, tetapi dengan penyesuai yang betul, ia berfungsi dengan sempurna.
Dalam JavaScript, anda mungkin menggunakan corak Penyesuai apabila anda menyepadukan dengan perpustakaan atau API pihak ketiga yang tidak betul-betul sepadan dengan struktur aplikasi anda. Penyesuai boleh mengubah antara muka kelas kepada antara muka lain yang diharapkan oleh pelanggan, menjadikan penyepaduan itu lancar.
class OldApi { constructor() { this.data = 'Old API data'; } getData() { return this.data; } } class NewApi { fetchData() { return 'New API data'; } } class ApiAdapter { constructor(oldApi) { this.oldApi = oldApi; } fetchData() { return this.oldApi.getData(); } } const oldApi = new OldApi(); const adapter = new ApiAdapter(oldApi); console.log(adapter.fetchData()); // 'Old API data'
The Composite pattern allows you to treat individual objects and compositions of objects uniformly. It’s like Russian nesting dolls where each doll is part of a larger structure, but you can interact with them both as individual dolls and as a nested set.
This pattern is often used in scenarios where you need to manage a hierarchy of objects. For example, consider a file system where files and folders are represented as objects. A folder can contain multiple files or even other folders, and you want to treat both files and folders similarly when it comes to operations like moving, copying, or deleting.
class File { constructor(name) { this.name = name; } display() { console.log(this.name); } } class Folder { constructor(name) { this.name = name; this.children = []; } add(child) { this.children.push(child); } display() { console.log(this.name); this.children.forEach(child => child.display()); } } const file1 = new File('file1.txt'); const file2 = new File('file2.txt'); const folder = new Folder('MyFolder'); folder.add(file1); folder.add(file2); folder.display(); // Output: // MyFolder // file1.txt // file2.txt
These are just a few of the many design patterns that can make your JavaScript code more robust, maintainable, and, let’s face it, fun to write. Whether you’re building the next big app or just trying to organize your code a bit better, these patterns can be your secret weapon. So next time you’re stuck, remember: there’s probably a pattern for that!
And hey, even if your code doesn’t end up looking like a LEGO spaceship, at least it won’t be a pile of colorful chaos.
Happy coding! ?
위 내용은 소프트웨어 디자인 패턴: 모든 훌륭한 앱 뒤에 숨은 비밀 소스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!