بخش های اصلی

آموزش الگوهای طراحی

Design Pattern - الگوی Service Locator

الگوی service locator زمانی که میخوایم چندین service را با استفاده از جستجوی JNDI در مکانشان قرار بدیم، استفاده میشه. با توجه به هزینه ی بالای جستجوی JNDI برای یک service، الگوی Locator از تکنیکِ ذخیره سازی در حافظه ی نهان (caching) استفاده می کنه. برای اولین باری که به service احتیاج پیدا بشه، service locator شروع به جستجو در JNDI میکنه و شیءِ service را در حافظه ی نهان ذخیره می کنه (cache). جستجوی بعدی یا همان جستجو توسط service locator در سری بعدی در حافظه ی نهان (cache) انجام میشه که کارایی برنامه را به طور قابل توجهی افزایش میده. موارد زیر، از موجودیت های این نوع الگوی طراحی اند:

  • Service – Service اصلی که درخواست را پردازش خواهد کرد. ارجاع به چنین serviceای باید در سرورِ JNDI جستجو بشه.
  • Context / Initial Context – JNDI Context ارجاعاتِ service را برای اهداف جستجو، نگه میداره.
  • Service locator – Service Locator یکی از اهداف برقراری ارتباط برای گرفتنِ serviceها از طریق ذخیره ی serviceها در حافظه ی نهان توسط جستجوی JNDI است.
  • Cache (حافظه ی نهان) – Cache برای ذخیره ی ارجاعات سرویس ها و استفاده ی دوباره از آن هاست.
  • Client – Client شیء ایِه که توسط ServiceLocator، serviceها را فراخوانی می کنه.

پیاده سازی

در این بخش یک ServiceLocator، InitialContext، Cache و Service بعنوان اشیاءِ مختلفی که concrete serviceهای نمایشیِ entities.Service1 و Service2 را ارائه می دن، ایجاد می کنیم.

ServiceLocatorPatternDemo، نسخه ی آزمایشی کلاس مان بعنوان یک client عمل می کنه و از ServiceLocator برای ارائه ی الگوی طراحیِ Service Locator استفاده خواهد کرد.

service locator pattern uml diagram

مرحله ی 1

ایجاد رابطِ Service.

Service.java

public interface Service {
   public String getName();
   public void execute();
}

مرحله ی 2

ایجاد کلاس های concrete service.

Service1.java

public class Service1 implements Service {
   public void execute(){
      System.out.println("Executing Service1");
   }

   @Override
   public String getName() {
      return "Service1";
   }
}

Service2.java

public class Service2 implements Service {
   public void execute(){
      System.out.println("Executing Service2");
   }

   @Override
   public String getName() {
      return "Service2";
   }
}

مرحله ی 3

ایجادِ InitialContext برای جستجویِ JNDI.

InitialContext.java

public class InitialContext {
   public Object lookup(String jndiName){
   
      if(jndiName.equalsIgnoreCase("SERVICE1")){
         System.out.println("Looking up and creating a new Service1 object");
         return new Service1();
      }
      else if (jndiName.equalsIgnoreCase("SERVICE2")){
         System.out.println("Looking up and creating a new Service2 object");
         return new Service2();
      }
      return null;		
   }
}

مرحله ی 4

ایجادِ Cache.

Cache.java

import java.util.ArrayList;
import java.util.List;

public class Cache {

   private List<Service> services;

   public Cache(){
      services = new ArrayList<Service>();
   }

   public Service getService(String serviceName){
   
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(serviceName)){
            System.out.println("Returning cached  " + serviceName + " object");
            return service;
         }
      }
      return null;
   }

   public void addService(Service newService){
      boolean exists = false;
      
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(newService.getName())){
            exists = true;
         }
      }
      if(!exists){
         services.add(newService);
      }
   }
}

مرحله ی 5

ایجادِ Service Locator.

ServiceLocator.java

public class ServiceLocator {
   private static Cache cache;

   static {
      cache = new Cache();		
   }

   public static Service getService(String jndiName){

      Service service = cache.getService(jndiName);

      if(service != null){
         return service;
      }

      InitialContext context = new InitialContext();
      Service service1 = (Service)context.lookup(jndiName);
      cache.addService(service1);
      return service1;
   }
}

مرحله ی 6

استفاده از ServiceLocator برای ارائه ی الگوی طراحیِ Service Locator.

ServiceLocatorPatternDemo.java

public class ServiceLocatorPatternDemo {
   public static void main(String[] args) {
      Service service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();
      service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();		
   }
}

مرحله ی 7

بررسی خروجی

Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached  Service1 object
Executing Service1
Returning cached  Service2 object
Executing Service2
در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش الگوهای طراحی

Learn Design Patterns

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد