HashMap 的装饰器设计模式返回空 HashMap
Decorator Design Pattern with HashMap returning empty HashMap
我正在尝试为 HashMap 实现装饰器设计模式。
我有两个装饰器 - “UpperCaseHashMap”和“AddHashMap”。
实施 1 :-
然而,结果图仅包含其中一个装饰器的效果,例如:-
只有 AddHashMap 效果即结果是 - {AA=AA}
Map map = new AddHashMap<>(new UpperCaseHashMap<>(new HashMap<> ()));
map.add("aa", "aa");
System.out.println(地图);
只有 UpperCaseHashMap 效果,即结果是 - {aaADDED_BY_DECORATOR=aa}
Map map = new UpperCaseHashMap<>(new AddHashMap<>(new HashMap<> ()));
map.add("aa", "aa");
System.out.println(地图);
下面是装饰器的代码classes:-
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> extends HashMap<K, V> {
/**
*
*/
private static final long serialVersionUID = 1L;
Map<K, V> map;
AddHashMap(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 super.put(key, value);
}
}
实现 2 :- - 结果图为空
public class AddHashMapImpl2 extends HashMapDecorator {
/**
*
*/
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> map) {
this.map = map;
}
public V put(K key, 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);
}
}
我在这段代码中使用了 'decorator' 来匹配您原来的问题,但实际上,这并没有使用装饰器设计模式,所以实际上,我会使用不同的名称,例如 'transformer'.
我正在尝试为 HashMap 实现装饰器设计模式。
我有两个装饰器 - “UpperCaseHashMap”和“AddHashMap”。
实施 1 :-
然而,结果图仅包含其中一个装饰器的效果,例如:-
只有 AddHashMap 效果即结果是 - {AA=AA}
Map
map = new AddHashMap<>(new UpperCaseHashMap<>(new HashMap<> ())); map.add("aa", "aa"); System.out.println(地图); 只有 UpperCaseHashMap 效果,即结果是 - {aaADDED_BY_DECORATOR=aa}
Map
map = new UpperCaseHashMap<>(new AddHashMap<>(new HashMap<> ())); map.add("aa", "aa"); System.out.println(地图);
下面是装饰器的代码classes:-
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> extends HashMap<K, V> {
/**
*
*/
private static final long serialVersionUID = 1L;
Map<K, V> map;
AddHashMap(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 super.put(key, value);
}
}
实现 2 :- - 结果图为空
public class 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> map) {
this.map = map;
}
public V put(K key, 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);
}
}
我在这段代码中使用了 'decorator' 来匹配您原来的问题,但实际上,这并没有使用装饰器设计模式,所以实际上,我会使用不同的名称,例如 'transformer'.