talep
İşte herkesin anlaması için sanal bir iş gereksinimi. Diyelim ki bir sipariş sistemi var ve içerideki bir işlev, farklı sipariş türlerine göre farklı işlemler yapmak.
Sipariş varlığı:
servis arayüzü:
Geleneksel gerçekleştirme
Sipariş türüne göre başka bir şey yazın:
Strateji modu uygulaması
Strateji modelini kullanarak, iş mantığını uygulamak için yalnızca iki satıra ihtiyaç vardır:
HandlerContext'in, farklı iş işlemcilerini depolamak için kullanılan bir işlemci bağlamı olan yukarıdaki yönteme enjekte edildiğini görebilirsiniz ve aşağıda ayrıntılı olarak açıklanacaktır. AbstractHandler'dan soyut bir işleyici alıyoruz, iş mantığını uygulamak için yöntemini çağırıyoruz.
Artık ana iş mantığımızın işlemcide uygulandığını anlayabiliyoruz, bu nedenle işlemci sayısı kadar sipariş türü var. Gelecekte, talep değişir ve sipariş türü eklenir.Sadece ilgili işlemciyi eklemeniz gerekir.Yukarıdaki OrderServiceV2Impl'nin hiç değiştirilmesine gerek yoktur.
İş işlemcisinin ifadelerine bir göz atalım:
İlk olarak, her bir işlemci yay kabına eklenmelidir, bu nedenle @Component ile açıklama eklenmesi gerekir ve ikinci olarak, işlemcinin hangi sipariş türüne karşılık geldiğini belirlemek için özel bir @ HandlerType eklenmesi gerekir ve son olarak AbstractHandler'ı devralır ve kendini uygular. İş mantığı.
Özel ek açıklama @HandlerType:
Soyut işleyici AbstractHandler:
Özel açıklamalar ve soyut işlemciler çok basittir, bu nedenle işlemciyi yaylı konteynere nasıl kaydedebilirsiniz?
Spesifik fikirler şunlardır:
1. Belirtilen pakette @HandlerType ile işaretlenmiş sınıfı tarayın;
2. Ek açıklamadaki tür değerini anahtar olarak ve karşılık gelen sınıfı değer olarak kullanın ve Harita'da kaydedin;
3. HandlerContext'i başlatmak ve yay konteynerine kaydetmek için yukarıdaki haritayı yapıcı parametresi olarak kullanın;
Yukarıdaki işlevleri tamamlamak için HandlerProcessor sınıfındaki temel işlevleri özetliyoruz.
İşleyici İşlemci:
ClassScanner: Tarama aracı sınıfı kaynak kodu
HandlerProcessor'ın BeanFactoryPostProcessor uygulaması gerekiyor. Çekirdeği yay işlemeden önce, özel çekirdeği kaba kaydedin.
Temel çalışma tamamlandı, şimdi HandlerContext'in ilgili işlemciyi nasıl elde ettiğine bir göz atın:
HandlerContext:
BeanTool: Bean tool sınıfını edinin
#GetInstance yöntemi, türe göre ilgili sınıfı elde eder ve ardından sınıf türüne göre ilkbaharda kayıtlı fasulyeyi alır.
Son olarak, proje başladığında bir rol oynayabilmek için HandlerProcessor ve BeanTool'un @Bean aracılığıyla taranması veya açıkça kaydedilmesi gerektiğini lütfen unutmayın.
sonuç olarak
Strateji modunun kullanılması karmaşıksa kodu basitleştirebilir ve bakımı kolaylaştırabilirken, özel açıklamaların ve kendi kendine kayıt yöntemlerinin kullanılması, gereksinimlerdeki değişikliklere yanıt vermeyi kolaylaştırabilir. Bu makale sadece genel bir fikir veriyor ve esnek bir şekilde değiştirilebilecek birçok ayrıntı var, örneğin sıralı tipler veya statik sabitler kullanmak gibi. Daha fazla ve daha iyi yöntemler düşünebileceğinize inanıyorum.
Örnek kod: https://github.com/ciphermagic/java-learn/tree/master/sandbox/src/main/java/com/cipher/handler_demo