内容简介:服务定位器模式(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()
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 简单工厂模式、工厂模式、抽象工厂模式的解析-iOS
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编写可读代码的艺术
Boswell, D.、Foucher, T. / 尹哲、郑秀雯 / 机械工业出版社 / 2012-7-10 / 59.00元
细节决定成败,思路清晰、言简意赅的代码让程序员一目了然;而格式凌乱、拖沓冗长的代码让程序员一头雾水。除了可以正确运行以外,优秀的代码必须具备良好的可读性,编写的代码要使其他人能在最短的时间内理解才行。本书旨在强调代码对人的友好性和可读性。 本书关注编码的细节,总结了很多提高代码可读性的小技巧,看似都微不足道,但是对于整个软件系统的开发而言,它们与宏观的架构决策、设计思想、指导原则同样重要。编......一起来看看 《编写可读代码的艺术》 这本书的介绍吧!
Base64 编码/解码
Base64 编码/解码
XML、JSON 在线转换
在线XML、JSON转换工具