Mode strategi pemrograman mode Delphi (lanjutan)
Liu Yi
1.3 Penerapan model strategi dalam sistem manajemen hotel
Dalam sistem manajemen hotel, biasanya harga sebuah kamar tidak bersifat statis. Harus ada strategi penjualan yang berbeda untuk akomodasi di luar musim dan musim puncak, pelanggan lama dan pelanggan baru, tamu individu dan kelompok. Jelas sekali, strategi penjualan menentukan penawaran. Namun, sistem penawaran berdasarkan strategi penjualan tidak dapat terikat pada klien tertentu, karena hanya dengan menjadikan sistem penawaran berdasarkan strategi penjualan independen maka dapat dijamin dapat digunakan kembali dan dipelihara. Misalnya: di satu sisi, sistem penawaran memenuhi kebutuhan banyak klien seperti penyelidikan tarif kamar preferensial dan penyelesaian kamar; di sisi lain, sistem ini memenuhi kebutuhan untuk terus-menerus menyesuaikan strategi penjualan baru. Hal ini benar-benar dapat mencapai penggunaan kembali dan pemeliharaan . Untuk persyaratan desain di atas, yang terbaik adalah memilih mode strategi. Pola Strategi memungkinkan perubahan algoritma secara independen dari klien yang menggunakannya. Program sampel adalah modul permintaan harga perumahan preferensial berdasarkan model strategi, yang mencakup sistem penawaran berdasarkan strategi penjualan dan antarmuka permintaan harga perumahan preferensial. Tentu saja, antarmuka permintaan harga preferensial hanya salah satu klien dari sistem kutipan, dan sistem kutipan juga dapat digunakan oleh klien lain. Desain modul permintaan harga preferensial ditunjukkan pada Gambar 1‑6. Ini mencakup: · Kelas strategi penjualan TSaleStrategy, yang merupakan kelas dasar abstrak untuk kelas strategi penjualan tertentu. · 3 kategori strategi penjualan spesifik: TVipStrategy (strategi penjualan kartu VIP), TTeamStrategy (strategi penjualan tim), TSeasonStrategy (strategi penjualan musiman). · Kutipan kelas TPRiceContext, yang merupakan konteks dalam pola strategi ini dan mengacu pada TStrategy. · Kelas klien TClient adalah kelas formulir, yang merupakan antarmuka untuk penyelidikan harga rumah. Gambar 1‑6 Contoh program 1‑1 untuk modul penyelidikan tarif kamar preferensial berdasarkan pola strategi adalah kode sumber unit HotelSaleStrategy. Unit ini berisi logika bisnis sistem penawaran berdasarkan strategi penjualan dan diimplementasikan menggunakan pola strategi . Sebagai kelas dasar abstrak dari strategi penjualan, TSaleStrategy bertujuan untuk menyediakan antarmuka umum. Fungsi abstrak virtual SalePrice adalah antarmuka seperti itu. Karena tiga strategi penjualan spesifik dirumuskan berdasarkan musim, kartu VIP, dan ukuran tim, desain parameter antarmuka kelas dasar SalePrice harus memenuhi kebutuhan berbeda dari tiga kelas turunan. Fungsi SalePrice dari TSaleStrategy dideklarasikan sebagai berikut: function SalePrice(price:Currency;value:integer):Currency virtual; untuk kelas turunan yang berbeda. Dalam strategi penjualan musiman TSeasonStrategy, parameter ini dinyatakan sebagai bulan check-in; dalam strategi penjualan kartu VIP TVIPStrategy, parameter ini dinyatakan sebagai jenis kartu VIP; dalam strategi penjualan tim TTeamStrategy, parameter ini dinyatakan sebagai jumlah orang dalam tim. Kami menemukan bahwa semua parameter ini dapat menggunakan tipe integer, jadi di kelas dasar, parameter nilai digunakan dengan cerdik untuk menyelesaikan berbagai persyaratan parameter dari kelas turunan. Dengan cara ini, TPriceContext dapat langsung memasukkan data ke dalam parameter dan meneruskannya ke operasi strategi penjualan yang berbeda, menghindari redundansi parameter. {TPriceContext }function TPriceContext.GetPrice(price:Currency;value:integer):Currency;begin result:=Strategy.SalePrice(price,value);end;TPriceContext memainkan peran kontekstual dalam mode strategi ini dan bertanggung jawab untuk mereferensikan penjualan strategi Contoh objek yang berbeda memanggil antarmuka SalePrice untuk secara dinamis mengkonfigurasi algoritma diskon tertentu dan mengembalikan harga jual sebenarnya. Karena perantara TPriceContext, klien tidak perlu mengetahui bagaimana strategi penjualan spesifik diterapkan, demikian pula, ketika strategi penjualan diperbarui dan disesuaikan, hal itu tidak akan berdampak pada program klien; Contoh program 1‑1 Kode sumber unit HotelSaleStrategy HotelSaleStrategy;antarmuka SysUtils, Windows, Pesan, Kelas, Grafik, Kontrol, Formulir, Dialog;ketik TSaleStrategy = kelas (TObject) fungsi publik HargaPenjualan(harga: Mata Uang; nilai: bilangan bulat): Mata Uang ; virtual; abstrak; akhir; TSeasonStrategy = fungsi publik kelas (TSaleStrategy). SalePrice(harga:Currency;value:integer):Currency; override; akhir; TVIPStrategy = kelas (TSaleStrategy) fungsi publik SalePrice(price:Currency;value:integer):Currency end; Harga Jual(harga:Mata Uang;nilai:bilangan bulat):Penggantian Mata Uang; (TObject) FStrategy pribadi: TSaleStrategy; procedure SetStrategy(Nilai: TSaleStrategy); fungsi publik GetPrice(price:Currency;value:integer):Currency; property Strategy: TSaleStrategy baca FStrategy tulis SetStrategy; TSeasonStrategy.SalePrice(price:Currency;value:integer):Currency;begin //Strategi penjualan musiman diskon {15% di bulan Februari, Maret, dan November, diskon 10% di bulan April dan Juni. 8. Diskon 9,5% di bulan September. } nilai kasus 2,3,11:hasil:=harga*0,85; 4,6:hasil:=harga*0,9; 8,9:hasil:=harga*0,95; TVIPStrategy }fungsi TVIPStrategy.SalePrice(harga:Mata Uang;nilai:integer):Mata Uang;mulai //strategi penjualan kartu VIP{ 0:Kartu VIP Silver diskon 10% 1:Kartu VIP Gold diskon 20% 2:Kartu VIP Diamond diskon 30%} nilai kasus 0:hasil:=harga*0,9; =harga*0,7; akhir;akhir;{TTeamStrategy }fungsi TTeamStrategy.SalePrice(price:Currency;value:integer):Currency;begin //Strategi penjualan tim diskon 10% untuk tim yang terdiri dari 3-5 orang; diskon 20% untuk tim yang terdiri dari 6-10 orang; tim yang terdiri dari 11-20 orang; diskon 20 40% untuk grup lebih dari 1 orang. } hasil:=harga; jika (nilai<6) dan (nilai>2) maka hasil:=harga*0,9; jika (nilai<11) dan (nilai>5) maka hasil:=harga*0,8; 21) dan (nilai>10) maka hasil:=harga*0.7; jika (nilai>20) maka hasil:=harga*0.6;akhir;{TPriceContext }fungsi TPriceContext.GetPrice(price:Currency;value:integer):Currency;mulai hasil:=Strategy.SalePrice(price,value);akhir;prosedur TPriceContext.SetStrategy(Nilai: TSaleStrategy);mulai FStrategy:=Value;end;end. Program klien dari modul kueri tarif kamar preferensial ditunjukkan pada Contoh Program 1-2. Program ini menyediakan antarmuka pemilihan pengguna sehingga penanya dapat memilih paket preferensial. Setelah Anda memilih ketentuan preferensi dan tarif umum, klik tombol "Periksa Tarif Preferensi" untuk mendapatkan tarif diskon. Efek operasi sebenarnya ditunjukkan pada Gambar 1-7. Contoh program 1‑2 Unit kode sumber unit ClientForm antarmuka menggunakan Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir, Dialog, StdCtrls, ExtCtrls, HotelSaleStrategy, ComCtrls,DateUtils ketik TClient = class(TForm) RadioGroup1 : Grup TRadio; TTombol; prosedur FormCreate(Pengirim: TObject); prosedur btnCheckClick(Pengirim: TObject); prosedur FormDestroy(Pengirim: TObject); prosedur btnExitClick(Pengirim: TObject); prosedur RadioGroup1Click(Pengirim: TObjectStrategy; TPriceContext; publik { Deklarasi publik } end;var Klien: TClient;implementasi{$R *.dfm}prosedur TClient.FormCreate(Pengirim: TObject);mulai FSeasonStrategy:=TSeasonStrategy.Create; ; FPriceSys:=TPriceContext.Create;end;prosedur TClient.btnCheckClick(Pengirim: TObject);var i:integer; harga:Mata Uang;mulai kasus RadioGroup1.ItemIndex dari 0:begin FPriceSys.Strategy:=FSeasonStrategy ; .DateTime); akhir; 1:mulai FPriceSys.Strategy:=FVIPStrategy ; i:=cmbVIP.ItemIndex; akhir; 2:mulai FPriceSys.Strategy:=FTeamStrategy ; 300; //Kamar standar Kelas A adalah 300 yuan 1:harga:=500; //Kamar standar Kelas B 500 yuan 2:harga:=800; //Ruang VIP 800 yuan 3:harga:=1000; //Suite bisnis 1000 yuan 4:harga:=2000; // Suite deluxe 2000 yuanend; Teks:=CurrToStr(FPriceSys.GetPrice(price,i));end;prosedur TClient.FormDestroy(Pengirim: TObject); mulai FPriceSys.Free; prosedur FSeasonStrategy.Free; FVIPStrategy.Free; edtCount.Enabled:=false; cmbVIP.Enabled:=false; case RadioGroup1.ItemIndex dari 0:dtpDate.Enabled:=true; end. Gambar 1-7 Antarmuka yang berjalan sebenarnya dari modul permintaan harga preferensial
1.4 Ringkasan latihan
Melalui demonstrasi dan analisis contoh-contoh sebelumnya, kita membahas lebih lanjut pola strategi sebagai berikut: · Pola strategi menyediakan cara untuk mengelola serangkaian algoritma. Hirarki kelas strategi menentukan serangkaian algoritme atau perilaku yang dapat digunakan kembali untuk TContext. Kelas dasar TStrategy mengekstrak fungsi-fungsi umum dalam algoritma ini, dan kelas turunannya memperkaya perbedaan dan jenis algoritma melalui pewarisan, dan menghindari duplikasi kode. · Jika Anda tidak memisahkan algoritma dari konteks di mana algoritma tersebut digunakan, dan secara langsung menghasilkan kelas turunan dari kelas TContext yang berisi algoritma tersebut, dan memberikan perilaku yang berbeda, ini akan mengkodekan perilaku tersebut ke dalam TContext, dan memisahkan implementasi algoritma dari TContext. Implementasinya tercampur aduk, membuat TContext sulit untuk dipahami, dipelihara, dan diperluas. Hasil akhirnya adalah sekumpulan kelas terkait, satu-satunya perbedaan di antara mereka adalah algoritma yang mereka gunakan. Jelas sekali, hubungan pewarisan kelas merupakan asosiasi yang kuat, dan hubungan pewarisan tidak dapat mengubah algoritme secara dinamis; sedangkan hubungan komposisi objek merupakan asosiasi yang lemah. Dengan menggabungkan objek kelas strategi, algoritme dapat berkembang secara independen dari lingkungan (TContext). dimana algoritma tersebut digunakan. · Gunakan pola strategi untuk memfaktorkan ulang kode program yang menggunakan sejumlah besar pernyataan cabang bersyarat. Ketika perilaku yang berbeda ditumpuk dalam suatu kelas, sulit untuk menghindari penggunaan pernyataan kondisional untuk memilih perilaku yang sesuai. Mengenkapsulasi perilaku dalam kelas kebijakan terpisah menghilangkan pernyataan kondisional ini. · Terlalu banyak algoritma dapat mengakibatkan sejumlah besar objek kebijakan. Untuk mengurangi overhead sistem, keadaan yang bergantung pada lingkungan algoritma biasanya dapat disimpan pada klien, dan TStrategy diimplementasikan sebagai objek tanpa kewarganegaraan yang dapat dibagikan oleh berbagai klien. Status eksternal apa pun dikelola oleh TContext. TContext meneruskan status ini pada setiap permintaan ke objek TStrategy. Misalnya, dalam program sampel, saya menyimpan bulan check-in status eksternal TSeasonStrategy, jenis kartu VIP status eksternal TVIPStrategy, dan ukuran tim status eksternal TTeamStrategy pada klien, dan meneruskan status ini ke kelas strategi penjualan melalui TPriceContext. Keuntungannya adalah kelas strategi penjualan menjadi tanpa kewarganegaraan, dan dapat digunakan bersama oleh modul lain seperti modul penyelesaian ruangan. · Terlepas dari apakah algoritma yang diterapkan oleh masing-masing strategi spesifik itu sederhana atau kompleks, semuanya berbagi antarmuka yang ditentukan oleh TStrategy. Oleh karena itu, kemungkinan besar beberapa kebijakan tertentu tidak akan menggunakan semua informasi yang diberikan kepada mereka melalui antarmuka ini. Jika saya mendesain antarmuka TSaleStrategy seperti ini di contoh program:
Harga Jual(harga:Mata Uang;Bulan:integer;VIP:integer;
Hitung:integer):Mata uang;
Beberapa parameter ini tidak akan pernah digunakan oleh kelas strategi penjualan tertentu. Artinya terkadang TContext akan membuat dan menginisialisasi parameter yang tidak akan pernah digunakan. Jika ada masalah seperti itu dan Anda tidak dapat menggunakan teknik dalam program contoh, Anda hanya dapat mengadopsi metode yang digabungkan erat antara TStrategy dan TContext.
Artikel terkait lainnya dan contoh kode sumber program dapat diunduh dari situs web penulis: http://www.liu-yi.net