Rantai Apache Commons

1. Perkenalan

Apache Commons Chain adalah pustaka yang menggunakan pola Chain of Responsibility - umumnya digunakan untuk mengatur aliran pemrosesan yang kompleks di mana beberapa penerima dapat memproses permintaan.

Dalam artikel singkat ini, kita akan melihat contoh yang mewakili penarikan dari ATM.

2. Ketergantungan Maven

Untuk memulai, kami akan mengimpor versi terbaru pustaka ini menggunakan Maven:

 commons-chain commons-chain 1.2  

Untuk memeriksa versi terbaru perpustakaan ini - buka di sini.

3. Contoh Rantai

ATM mengambil nomor sebagai masukan dan meneruskannya ke penangan yang bertanggung jawab untuk melakukan tindakan yang berbeda. Itu termasuk menghitung jumlah uang kertas yang akan dibagikan, dan mengirimkan pemberitahuan kepada bank dan pelanggan tentang transaksi tersebut.

4. Konteks Rantai

Konteks mewakili keadaan aplikasi saat ini, menyimpan informasi tentang transaksi.

Untuk permintaan penarikan ATM kami, informasi yang kami butuhkan adalah:

  • Jumlah total yang akan ditarik
  • Jumlah 100 uang kertas
  • Jumlah 50 uang kertas
  • Jumlah 10 uang kertas pecahan
  • Jumlah yang tersisa untuk ditarik

Status 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 proses itu.

Kami akan menerapkan 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 karena FiftyDenominationDispenser & TenDenominationDispenser serupa.

6. Rantai

Sebuah rantai adalah kumpulan perintah yang akan dieksekusi dalam urutan tertentu. Rantai kami akan terdiri dari Command di atas dan juga AuditFilter di bagian akhir:

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

Ketika Komando apa pun dalam Rantai mengembalikan nilai true, itu memaksa Rantai untuk berakhir.

7. Filter

Filter juga merupakan Command tetapi dengan metode postProcess yang dipanggil setelah eksekusi Chain.

Filter kami akan mengirimkan notifikasi ke customer & 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 logisnya.

Dalam kasus kami, Katalog kami akan berisi AtmWithdrawalChain.

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

9. Menggunakan Rantai

Mari kita lihat bagaimana kita dapat menggunakan Chain di atas untuk memproses permintaan penarikan. Pertama-tama kita akan membuat Konteks dan kemudian meneruskannya ke Chain. The Rantai akan memproses Konteks.

Kami akan menulis kasus uji 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. Kesimpulan

Dalam tutorial ini, kami menjelajahi skenario praktis menggunakan pustaka Apache Commons Chain - yang dapat Anda baca lebih lanjut di sini.

Dan, seperti biasa, kode untuk artikel ini tersedia di Github.