如何解决HashMap的装饰器设计模式返回空HashMap
我正在尝试为HashMap实现Decorator设计模式。
我有两个装饰器-“ UpperCaseHashMap”和“ AddHashMap”。
实施方式1:-
但是,结果图仅包含装饰器之一的效果,例如:-
-
仅AddHashMap效果,即结果为-{AA = AA}
Map
map =新的AddHashMap (新的UpperCaseHashMap (新的HashMap ())); map.add(“ aa”,“ aa”); System.out.println(map); -
仅UpperCaseHashMap效果,即结果为-{aaADDED_BY_DECORATOR = aa}
Map
map =新的UpperCaseHashMap (新的AddHashMap (新的HashMap ())); map.add(“ aa”,“ aa”); System.out.println(map);
下面是装饰器类的代码:-
public class UpperCaseHashMap<K,V> extends HashMap<K,V> {
/**
*
*/
private static final long serialVersionUID = 1L;
Map<K,V> map;
public UpperCaseHashMap() {
map = new HashMap<>();
}
UpperCaseHashMap(Map<K,V> map) {
this.map = map;
}
public V put(K key,V value) {
String temp = key.toString().toupperCase();
key = (K) temp;
return super.put(key,value);
}
}
public class AddHashMap<K,V> map;
AddHashMap(Map<K,V value) {
String temp = key.toString().concat("ADDED_BY_DECORATOR");
key = (K) temp;
return super.put(key,value);
}
}
实施2:--结果图为空
公共类AddHashMapImpl2
/**
*
*/
private static final long serialVersionUID = 1L;
Map<K,V> map;
AddHashMapImpl2(Map<K,V> map) {
this.map = map;
}
public V put(K key,V value) {
String temp = key.toString().concat("ADDED_BY_DECORATOR");
key = (K) temp;
return map.put(key,value);
}
}
public class UpperCaseHashMapImpl2<K,V> extends HashMapDecorator<K,V> {
/**
*
*/
private static final long serialVersionUID = 1L;
Map<K,V> map;
public UpperCaseHashMapImpl2() {
map = new HashMap<>();
}
UpperCaseHashMapImpl2(Map<K,V value) {
String temp = key.toString().toupperCase();
key = (K) temp;
return map.put(key,value);
}
}
解决方法
您的行:
return super.put(key,value);
无论传递给构造函数的映射的实现如何,都在调用HashMap.put
。相反,您需要:
return map.put(key,value);
但是,我觉得您可能误会了装饰器的工作方式。如果使用子类,则需要将每个方法转发给委托。目前,您的课程正在扩展HashMap
,然后专门委派put
。这行不通。所有其他方法都将转到扩展的HashMap
,并且找不到您放入委托中的数据。您需要重新考虑设计。
您可能需要考虑以下设计:
@FunctionalInterface
interface MapDecorator<V> {
V decorate(V value);
}
class DecoratedMap<K,V> extends HashMap<K,V> {
private final List<MapDecorator<V>> decorators = new ArrayList<>();
public void addDecorator(MapDecorator<V> decorator) {
decorators.add(decorator);
}
@Override
public V put(K key,V value) {
for (MapDecorator<V> decorator: decorators)
value = decorator.decorate(value);
return super.put(key,value);
}
}
我在此代码中使用了“装饰器”来匹配您的原始问题,但实际上,这并未使用装饰器设计模式,因此,实际上,我将使用其他名称,例如“变压器”。 / p>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。