【发布时间】:2019-09-04 15:47:58
【问题描述】:
我想以最惯用的方式在 Golang 中复制以下 Java 代码:
public class Handler {
private Storage storage;
private Mapper mapper;
public Handler(Storage storage, Mapper mapper) {
this.storage = storage;
this.mapper = mapper;
}
public void handleKey(String k) {
storage.put(k, mapper.map(k));
}
}
interface Storage {
public void put(String k, String v);
public String get(String k);
}
@FunctionalInterface
interface Mapper {
public String map(String a);
}
private static class InMemoryStorage implements Storage {
private Map<String, String> table;
public InMemoryStorage() {
table = new HashMap<>();
}
public void put(String k, String v) {
table.put(k, v);
}
public String get(String k) {
return table.get(k);
}
}
Handler 类只公开方法handleKey。此类的行为通过传递不同的具体 Storage 和 Mapper 实现来参数化。
在阅读Effective Go - Embedding 之后,我认为这将是嵌入接口介绍结构的一个很好的用途。但我不知道如何避免将嵌入式接口的方法暴露给Handler 用户。我可以做类似的事情
type Handler struct {
store Storage
mapper Mapper
}
func (h Handler) Handle(k string) {
h.store.Put(k, h.mapper.Map(k))
}
type Storage interface {
Put(k string, v string)
Get(k string) string
}
type Mapper interface {
Map(k string) string
}
type inMemoryStorage {
table map[string]string
}
func NewInMemoryStorage() Storage {
return &inMemoryStore{table: make(map[string]string)}
}
但是我不能将具体实现传递给Handler(创建结构文字),因为store 和mapper 未导出。而且我不想为每个可能的组合创建工厂方法......有什么建议吗?
【问题讨论】:
-
public Handler(Storage storage, Mapper mapper) {在 Go 中将是NewHandler(storage Storage, mapper Mapper) *Handler {...
标签: oop go design-patterns dependency-injection interface