Rantai Apache Commons

1. Pengenalan

Rantai Apache Commons adalah perpustakaan yang menggunakan corak Rantai Tanggungjawab - umumnya digunakan untuk mengatur aliran pemprosesan yang kompleks di mana beberapa penerima dapat memproses permintaan.

Dalam artikel ringkas ini, kita akan melalui contoh yang menunjukkan penarikan dari ATM.

2. Ketergantungan Maven

Untuk memulakan, kami akan mengimport versi terbaru perpustakaan ini menggunakan Maven:

 commons-chain commons-chain 1.2  

Untuk memeriksa versi terbaru perpustakaan ini - pergi ke sini.

3. Rantai Contoh

ATM mengambil nombor sebagai input dan menyerahkannya kepada pengendali yang bertanggungjawab melakukan tindakan yang berbeza. Itu melibatkan menghitung jumlah wang kertas yang akan dikeluarkan, dan mengirimkan pemberitahuan kepada bank dan pelanggan mengenai transaksi tersebut.

4. Konteks Rantai

Konteks mewakili keadaan aplikasi semasa, menyimpan maklumat mengenai transaksi.

Untuk permintaan pengeluaran ATM kami, maklumat yang kami perlukan adalah:

  • Jumlah keseluruhan yang akan dikeluarkan
  • Bilangan 100 nota denominasi
  • Bilangan 50 nota denominasi
  • Bilangan 10 nota denominasi
  • Jumlah yang tinggal untuk dikeluarkan

Keadaan ini ditentukan dalam kelas:

public class AtmRequestContext extends ContextBase { int totalAmountToBeWithdrawn; int noOfHundredsDispensed; int noOfFiftiesDispensed; int noOfTensDispensed; int amountLeftToBeWithdrawn; // standard setters & getters }

5. Perintah

The Command mengambil C ontext sebagai input dan memprosesnya.

Kami akan melaksanakan setiap langkah yang disebutkan di atas sebagai Perintah:

public class HundredDenominationDispenser implements Command { @Override public boolean execute(Context context) throws Exception { intamountLeftToBeWithdrawn = (int) context.get("amountLeftToBeWithdrawn); if (amountLeftToBeWithdrawn >= 100) { context.put("noOfHundredsDispensed", amountLeftToBeWithdrawn / 100); context.put("amountLeftToBeWithdrawn", amountLeftToBeWithdrawn % 100); } return false; } } 

The Command kerana FiftyDenominationDispenser & TenDenominationDispenser adalah sama.

6. Rantai

A Chain adalah koleksi arahan yang akan dilaksanakan dalam susunan tertentu. Rantai kami akan terdiri dari Perintah di atas dan juga FilterFilter pada akhir:

public class AtmWithdrawalChain extends ChainBase { public AtmWithdrawalChain() { super(); addCommand(new HundredDenominationDispenser()); addCommand(new FiftyDenominationDispenser()); addCommand(new TenDenominationDispenser()); addCommand(new AuditFilter()); } }

Apabila mana-mana Perintah dalam Rantai kembali benar, ia memaksa Rantai itu berakhir.

7. Tapis

Penapis juga merupakan Perintah tetapi dengan kaedah postProcess yang dipanggil setelah pelaksanaan Chain.

Penapis kami akan menghantar pemberitahuan kepada pelanggan & bank:

public class AuditFilter implements Filter { @Override public boolean postprocess(Context context, Exception exception) { // send notification to bank and user return false; } @Override public boolean execute(Context context) throws Exception { return false; } }

8. Katalog Rantai

Ini adalah kumpulan Rantai dan Perintah dengan nama logiknya.

Dalam kes kami, Katalog kami akan mengandungi AtmWithdrawalChain.

public class AtmCatalog extends CatalogBase { public AtmCatalog() { super(); addCommand("atmWithdrawalChain", new AtmWithdrawalChain()); } }

9. Menggunakan Rantai

Mari lihat bagaimana kita dapat menggunakan Rantai di atas untuk memproses permintaan penarikan. Kami akan membuat Konteks terlebih dahulu dan kemudian menyampaikannya Rantai. The Chain akan memproses Context.

Kami akan menulis kes ujian untuk menunjukkan AtmWithdrawalChain kami :

public class AtmChainTest { @Test public void givenInputsToContext_whenAppliedChain_thenExpectedContext() throws Exception { Context context = new AtmRequestContext(); context.put("totalAmountToBeWithdrawn", 460); context.put("amountLeftToBeWithdrawn", 460); Catalog catalog = new AtmCatalog(); Command atmWithdrawalChain = catalog.getCommand("atmWithdrawalChain"); atmWithdrawalChain.execute(context); assertEquals(460, (int) context.get("totalAmountToBeWithdrawn")); assertEquals(0, (int) context.get("amountLeftToBeWithdrawn")); assertEquals(4, (int) context.get("noOfHundredsDispensed")); assertEquals(1, (int) context.get("noOfFiftiesDispensed")); assertEquals(1, (int) context.get("noOfTensDispensed")); } }

10. Kesimpulannya

Dalam tutorial ini, kami meneroka senario praktikal menggunakan perpustakaan Apache Commons Chain - yang boleh anda baca lebih lanjut di sini.

Dan, seperti biasa, kod untuk artikel ini terdapat di Github.