Juga dikenali sebagai: Strategi
Corak Strategi ialah a Corak reka bentuk tingkah laku yang membolehkan anda mentakrifkan satu siri algoritma dan meletakkan setiap algoritma ke dalam kelas yang berasingan supaya objek algoritma boleh ditukar ganti.
Pada suatu hari, anda bercadang untuk membuat program pemandu pelancong untuk pelancong. Fungsi teras program ini adalah untuk menyediakan peta yang cantik untuk membantu pengguna mengarahkan diri mereka dengan cepat di mana-mana bandar.
Ciri baharu apl yang dinanti-nantikan pengguna ialah perancangan laluan automatik: mereka mahu memasukkan alamat dan melihat laluan terpantas ke destinasi mereka pada peta.
Versi pertama program hanya boleh merancang laluan jalan raya. Orang yang mengembara dengan kereta sangat gembira dengannya. Tetapi jelas, tidak semua orang memandu semasa bercuti. Jadi anda menambah keupayaan untuk merancang laluan berjalan kaki dalam kemas kini anda yang seterusnya. Anda telah menambah keupayaan untuk merancang laluan pengangkutan awam.
Dan ini hanyalah permulaan. Tidak lama lagi anda akan merancang laluan untuk penunggang basikal. Selepas beberapa ketika, anda sekali lagi perlu merancang laluan anda untuk melawat semua tarikan di bandar.
Kod panduan akan menjadi sangat kembung.
Walaupun aplikasi ini sangat berjaya dari sudut perniagaan, bahagian teknikalnya memberi anda sakit kepala yang besar: setiap kali algoritma perancangan laluan baharu ditambah, saiz kelas utama dalam aplikasi pemandu pelancong meningkat oleh satu kali. Akhirnya, pada satu ketika, anda merasakan bahawa anda tidak lagi boleh mengekalkan timbunan kod ini.
Sama ada membetulkan kecacatan mudah atau memperhalusi pemberat jalan, sebarang pengubahsuaian pada algoritma mempengaruhi seluruh kelas, meningkatkan risiko memperkenalkan pepijat ke dalam kod yang sudah berfungsi.
Selain itu, kerja berpasukan akan menjadi tidak cekap. Jika anda merekrut ahli pasukan selepas apl berjaya dikeluarkan, mereka akan mengadu bahawa terlalu banyak masa dihabiskan untuk menyelesaikan konflik gabungan. Dalam proses melaksanakan ciri baharu, pasukan anda perlu mengubah suai kelas besar yang sama, jadi kod yang mereka tulis mungkin bercanggah antara satu sama lain.
Corak Strategi mencadangkan mengenal pasti kelas yang bertanggungjawab untuk mencapai tugas tertentu dalam pelbagai cara, dan kemudian mengekstrak algoritma di dalamnya ke dalam satu set kelas bebas yang dipanggil strategi.
Konteks bernama kelas asal mesti mengandungi pembolehubah ahli untuk menyimpan rujukan kepada setiap strategi. Konteks tidak melaksanakan tugas, tetapi mewakilkan kerja kepada objek dasar yang disambungkan.
Konteks tidak bertanggungjawab untuk memilih algoritma yang memenuhi keperluan tugasan - pelanggan akan menghantar strategi yang diperlukan kepada konteks. Sebenarnya, konteks tidak tahu banyak tentang strategi, ia berinteraksi dengan semua strategi melalui antara muka biasa yang sama, yang hanya perlu mendedahkan kaedah untuk mencetuskan algoritma yang terkandung dalam strategi yang dipilih.
Oleh itu, konteks boleh bebas daripada strategi tertentu. Ini membolehkan anda menambah algoritma baharu atau mengubah suai yang sedia ada tanpa mengubah kod konteks atau strategi lain.
Strategi perancangan laluan.
Dalam aplikasi pemandu pelancong, setiap algoritma perancangan laluan boleh diekstrak ke dalam kelas berasingan dengan hanya satu buildRoute
kaedah laluan jana. Kaedah ini menerima titik mula dan tamat sebagai parameter dan mengembalikan koleksi titik tengah laluan.
Walaupun jika parameter yang dihantar kepada setiap kelas perancangan laluan adalah sama, laluan yang dibuat mungkin berbeza sama sekali. Tugas utama kelas pemandu pelancong utama adalah untuk memaparkan satu siri titik separuh jalan pada peta dan tidak mengambil berat tentang cara algoritma dipilih. Terdapat juga kaedah dalam kelas ini untuk menukar strategi perancangan laluan semasa, jadi pelanggan (seperti butang dalam antara muka pengguna) boleh menggantikan tingkah laku perancangan laluan yang sedang dipilih dengan strategi lain.
Pelbagai strategi perjalanan ke lapangan terbang
Jika anda perlu ke lapangan terbang. Anda boleh memilih untuk menaiki bas, menempah teksi atau menunggang basikal. Ini adalah strategi perjalanan anda. Anda boleh memilih salah satu daripada strategi ini berdasarkan faktor seperti belanjawan atau masa.
Konteks (Konteks) mengekalkan rujukan kepada strategi tertentu dan hanya lulus Antara muka dasar berkomunikasi dengan objek ini.
Strategi Antara muka (Strategi) ialah antara muka biasa untuk semua strategi khusus Ia mengisytiharkan kaedah konteks untuk melaksanakan strategi.
Strategi Konkrit melaksanakan variasi berbeza algoritma yang digunakan oleh konteks.
Apabila konteks perlu menjalankan algoritma, ia memanggil kaedah laksana pada objek strategi bersambungnya. Konteksnya tidak jelas tentang jenis strategi yang terlibat dan cara algoritma dilaksanakan.
Pelanggan (Pelanggan) mencipta objek dasar tertentu dan menyerahkannya kepada konteks. Konteks menyediakan penetap supaya pelanggan boleh mengatasi dasar yang berkaitan pada masa jalan.
Dalam contoh ini, konteks menggunakan berbilang strategi untuk melaksanakan operasi pengiraan yang berbeza.
// 策略接口声明了某个算法各个不同版本间所共有的操作。上下文会使用该接口来 // 调用有具体策略定义的算法。 interface Strategy is method execute(a, b) // 具体策略会在遵循策略基础接口的情况下实现算法。该接口实现了它们在上下文 // 中的互换性。 class ConcreteStrategyAdd implements Strategy is method execute(a, b) is return a + b class ConcreteStrategySubtract implements Strategy is method execute(a, b) is return a - b class ConcreteStrategyMultiply implements Strategy is method execute(a, b) is return a * b // 上下文定义了客户端关注的接口。 class Context is // 上下文会维护指向某个策略对象的引用。上下文不知晓策略的具体类。上下 // 文必须通过策略接口来与所有策略进行交互。 private strategy: Strategy // 上下文通常会通过构造函数来接收策略对象,同时还提供设置器以便在运行 // 时切换策略。 method setStrategy(Strategy strategy) is this.strategy = strategy // 上下文会将一些工作委派给策略对象,而不是自行实现不同版本的算法。 method executeStrategy(int a, int b) is return strategy.execute(a, b) // 客户端代码会选择具体策略并将其传递给上下文。客户端必须知晓策略之间的差 // 异,才能做出正确的选择。 class ExampleApplication is method main() is 创建上下文对象。 读取第一个数。 读取最后一个数。 从用户输入中读取期望进行的行为。 if (action == addition) then context.setStrategy(new ConcreteStrategyAdd()) if (action == subtraction) then context.setStrategy(new ConcreteStrategySubtract()) if (action == multiplication) then context.setStrategy(new ConcreteStrategyMultiply()) result = context.executeStrategy(First number, Second number) 打印结果。
Apabila anda ingin menggunakan pelbagai varian algoritma dalam objek dan ingin dapat menukar algoritma pada masa jalan, anda boleh menggunakan mod strategi.
Corak Strategi membolehkan anda menukar gelagat objek secara tidak langsung pada masa jalan dengan mengaitkan objek kepada sub-objek berbeza yang boleh melaksanakan sub-tugas tertentu dengan cara yang berbeza.
Gunakan corak Strategi apabila anda mempunyai banyak kelas serupa yang hanya berbeza sedikit dalam cara mereka melaksanakan gelagat tertentu.
Corak Strategi membolehkan anda mengekstrak gelagat berbeza ke dalam hierarki kelas yang berasingan dan menggabungkan kelas asal menjadi satu yang sama, dengan itu mengurangkan pertindihan kod.
Jika algoritma tidak begitu penting dalam logik konteks, menggunakan corak ini boleh mengasingkan logik perniagaan kelas daripada butiran pelaksanaan algoritmanya.
Corak strategi membolehkan anda mengasingkan kod, data dalaman dan kebergantungan pelbagai algoritma daripada kod lain. Pelanggan yang berbeza boleh melaksanakan algoritma melalui antara muka yang mudah dan boleh ditukar pada masa jalan.
Corak ini boleh digunakan apabila operator bersyarat kompleks digunakan dalam kelas untuk bertukar antara varian berbeza algoritma yang sama.
Corak strategi mengekstrak semua algoritma yang diwarisi daripada antara muka yang sama ke dalam kelas bebas, jadi pernyataan bersyarat tidak lagi diperlukan. Objek primitif tidak melaksanakan semua varian algoritma, sebaliknya mewakilkan pelaksanaan kepada salah satu objek algoritma individu.
Ketahui algoritma dengan kekerapan pengubahsuaian yang lebih tinggi daripada kelas konteks (ia juga mungkin keadaan yang kompleks untuk memilih varian algoritma tertentu pada pengendali masa jalan) .
Mengisytiharkan antara muka strategi biasa untuk semua varian algoritma ini.
Ekstrak algoritma ke dalam kelas masing-masing satu demi satu, dan kesemuanya mesti melaksanakan antara muka strategi.
Tambah pembolehubah ahli dalam kelas konteks untuk menyimpan rujukan kepada objek strategi. Kemudian sediakan penetap untuk mengubah suai pembolehubah ahli. Konteks hanya boleh berinteraksi dengan objek dasar melalui antara muka dasar Jika perlu, antara muka boleh ditakrifkan untuk membenarkan dasar mengakses datanya.
Pelanggan mesti mengaitkan kelas konteks dengan dasar yang sepadan supaya konteks boleh melakukan tugas utamanya dengan cara yang diharapkan.
Anda boleh menukar algoritma dalam objek semasa masa jalan.
Anda boleh mengasingkan pelaksanaan algoritma daripada kod yang menggunakan algoritma.
Anda boleh menggunakan gubahan dan bukannya warisan.
Prinsip pembukaan dan penutup. Anda boleh memperkenalkan strategi baharu tanpa mengubah konteks.
Jika algoritma anda jarang berubah, tiada sebab untuk memperkenalkan kelas dan antara muka baharu. Menggunakan corak ini hanya akan menjadikan program terlalu rumit.
Pelanggan mesti tahu perbezaan antara strategi - ia perlu memilih strategi yang sesuai.
Banyak bahasa pengaturcaraan moden menyokong ciri jenis fungsi, membolehkan anda melaksanakan versi algoritma yang berbeza dalam satu set fungsi tanpa nama. Dengan cara ini, anda menggunakan fungsi ini dengan cara yang sama seperti menggunakan objek dasar, tanpa perlu menggunakan kelas dan antara muka tambahan untuk memastikan kod anda mudah.
Antara muka untuk corak Bridge, Stateful dan Strategy (dan sedikit sebanyak Penyesuai) adalah sangat serupa. Malah, semuanya berdasarkan corak gubahan-iaitu, mewakilkan kerja kepada objek lain, tetapi masing-masing menyelesaikan masalah yang berbeza. Corak bukan sekadar resipi untuk menyusun kod dengan cara tertentu; anda juga boleh menggunakannya untuk membincangkan masalah yang mereka selesaikan dengan pembangun lain.
Corak dan strategi arahan kelihatan serupa kerana kedua-duanya boleh meparameterkan objek dengan gelagat tertentu. Namun, niat mereka sangat berbeza.
Anda boleh menggunakan arahan untuk menukar sebarang operasi kepada objek. Parameter operasi akan menjadi pembolehubah ahli objek. Anda boleh menggunakan transformasi untuk menangguhkan pelaksanaan operasi, operasi baris gilir, menyimpan arahan sejarah atau menghantar arahan kepada perkhidmatan jauh.
Strategi, sebaliknya, selalunya boleh digunakan untuk menerangkan cara yang berbeza untuk mencapai sesuatu, membolehkan anda menukar algoritma dalam kelas konteks yang sama.
Mod hiasan membolehkan anda menukar rupa objek, manakala strategi membolehkan anda menukar intipatinya.
Corak kaedah templat adalah berdasarkan mekanisme pewarisan: ia membolehkan anda menukar sebahagian daripada algoritma dengan memanjangkan sebahagian daripada kandungan dalam subkelas. Strategi adalah berdasarkan mekanisme gubahan: anda boleh menukar sebahagian daripada gelagat objek dengan menyediakan strategi yang berbeza untuk gelagat yang sepadan. Kaedah templat beroperasi pada peringkat kelas, jadi ia adalah statik. Dasar beroperasi pada peringkat objek, dengan itu membenarkan tingkah laku ditukar pada masa jalan.
Negeri boleh dianggap sebagai lanjutan daripada strategi. Kedua-duanya adalah berdasarkan mekanisme gubahan: kedua-duanya mengubah tingkah lakunya dalam situasi yang berbeza dengan mewakilkan sebahagian daripada kerja kepada objek "pembantu". Dasar ini menjadikan objek ini bebas sepenuhnya antara satu sama lain, dan mereka tidak menyedari kewujudan objek lain. Walau bagaimanapun, corak keadaan tidak mengehadkan kebergantungan antara keadaan tertentu dan membenarkan mereka menukar keadaan mereka dalam senario yang berbeza.
Atas ialah kandungan terperinci Apakah corak strategi corak reka bentuk java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!