我正在尝试为HashMap实现装饰器设计模式。
我有两个装饰器-“UpperCaseHashMap”和“AddHashMap”。
实施1:-
然而,结果映射仅包含其中一个装饰器的效果,例如:-
>
仅AddHashMap效果,即结果为-{AA=AA}
map
只有UpperCaseHashMap效果,即结果为-{AAADDED_BY_DECROATOR=AA}
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> 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:--得到的映射为空
公共类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'来匹配您最初的问题,但实际上,这并不是使用decorator设计模式,所以实际上,我会使用一个不同的名称,比如'transformer'。
装饰(Decorator) Intent 为对象动态添加功能。 Class Diagram 装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是
当我回顾了“decorator”设计模式的大量示例时,我刚刚想到了一些示例,这些示例主要是关于更改总是返回字符串的方法,或者像cost()这样聚合数字的方法。 这真的是装饰器设计模式的唯一用法吗? 我只知道它用于Java IO API。 但我想有其他的东西,打印一个文本。一些真实的东西。我找了那么多,却找不到合适的样品。
本文向大家介绍用Python设计HashMap,包括了用Python设计HashMap的使用技巧和注意事项,需要的朋友参考一下 假设我们要设计一个HashMap而不使用任何内置的哈希表库。将有以下不同的功能- put(key,value)-这会将与key关联的值插入到HashMap中。如果HashMap中已经存在该值,请更新该值。 get(key)-这将返回指定键所映射到的值,如果此映射不包含该键
我尝试了一些变体,但没有运气返回GraphQL中的地图。因此,我有以下两个对象: 我的模式如下: 有人能告诉我如何实现这一点,以便GraphQL神奇地处理这一点或另一种方法。 非常感谢!
问题内容: 假设我有一个名为的类,并且我想使用装饰器设计模式。如果我错了,请纠正我,但是要使其正常工作,我们需要创建一个装饰器类,例如,该类将保留对实例的引用,所有其他装饰器将对其进行扩展以添加功能。 我不明白为什么我们必须创建装饰器类而不是使用实例? 问题答案: 装饰器模式用于动态地(即在运行时)向对象添加功能。通常,在编写类时,对象将具有固定的功能。但是重要的一点是,对象的功能以对对象的客户端
我有两个哈希图。其中每一个都有键,就像下面的hashmap一样。 此映射由DB2数据库查询输出的值填充。我注意到,即使我有两个这样的hashmap,并且如果我尝试检索hashmap键的值,它也总是返回null。我通过在监视窗口中添加所有需要的变量进行了检查。我觉得一切都很好。 我的代码的一小部分。 注意:inputMessageDbRecords的类型是