设计模式 - 服务定位器模式

栏目: IT技术 · 发布时间: 5年前

内容简介:服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种设计模式的实体。

服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种 设计模式 的实体。

  • 服务(Service) - 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到。
  • Context / 初始的 Context - JNDI Context 带有对要查找的服务的引用。
  • 服务定位器(Service Locator) - 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触。
  • 缓存(Cache) - 缓存存储服务的引用,以便复用它们。
  • 客户端(Client) - Client 是通过 ServiceLocator 调用服务的对象。
package main

import "fmt"

type Service interface {
	GetName() string
	Execute()
}

type Service1 struct{}

func (s *Service1) Execute() {
	fmt.Println("Executing service1")
}

func (s *Service1) GetName() string {
	return "Service1"
}

type Service2 struct{}

func (s *Service2) Execute() {
	fmt.Println("Executing service2")
}

func (s *Service2) GetName() string {
	return "Service2"
}

type InitContext struct{}

func (i *InitContext) Lookup(jndiName string) Service {
	if jndiName == "service1" {
		fmt.Println("looking up and creating a new service1 object")
		return &Service1{}
	}
	if jndiName == "service2" {
		fmt.Println("looking up and creating a new service2 object")
		return &Service2{}
	}
	return nil
}

type Cache struct {
	Services map[string]Service
}

func NewCache() *Cache {
	return &Cache{
		Services: map[string]Service{},
	}
}

func (c *Cache) GetService(serviceName string) Service {
	if v, ok := c.Services[serviceName]; ok {
		fmt.Println("return cached service: ", serviceName)
		return v
	}
	return nil
}

func (c *Cache) AddService(name string, service Service) {
	c.Services[name] = service
}

type ServiceLocator struct {
	Cache *Cache
}

func NewServiceLocator() *ServiceLocator {
	return &ServiceLocator{
		Cache: NewCache(),
	}
}

func (s *ServiceLocator) GetService(jndiName string) Service {
	service := s.Cache.GetService(jndiName)
	if service != nil {
		return service
	}
	// create a new service1
	context := &InitContext{}
	service = context.Lookup(jndiName)
	s.Cache.AddService(jndiName, service)
	return service
}

func main() {
	locator := NewServiceLocator()
	service := locator.GetService("service1")
	service.Execute()

	service = locator.GetService("service2")
	service.Execute()

	service = locator.GetService("service1")
	service.Execute()

	service = locator.GetService("service2")
	service.Execute()
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pattern Recognition and Machine Learning

Pattern Recognition and Machine Learning

Christopher Bishop / Springer / 2007-10-1 / USD 94.95

The dramatic growth in practical applications for machine learning over the last ten years has been accompanied by many important developments in the underlying algorithms and techniques. For example,......一起来看看 《Pattern Recognition and Machine Learning》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具