Java HashMap返回空HashMap的装饰器设计模式
我正在尝试为HashMap实现Decorator设计模式 我有两个装饰程序-“UpperCaseHashMap”和“AddHashMap” 实施1:- 但是,结果映射仅包含其中一个装饰器的效果,例如:-Java HashMap返回空HashMap的装饰器设计模式,java,design-patterns,hashmap,decorator,Java,Design Patterns,Hashmap,Decorator,我正在尝试为HashMap实现Decorator设计模式 我有两个装饰程序-“UpperCaseHashMap”和“AddHashMap” 实施1:- 但是,结果映射仅包含其中一个装饰器的效果,例如:- 只有AddHashMap效果,即结果是-{AA=AA} Map Map=newaddhashmap(newuppercasehashmap(newhashmap()); 地图。添加(“aa”、“aa”); 系统输出打印项次(map) 只有UpperCaseHashMap效果,即结果是-{aa
- 只有AddHashMap效果,即结果是-{AA=AA} Map Map=newaddhashmap(newuppercasehashmap(newhashmap()); 地图。添加(“aa”、“aa”); 系统输出打印项次(map)
- 只有UpperCaseHashMap效果,即结果是-{aaADDED_BY_DECORATOR=aa} Map Map=newuppercasehashmap(newaddhashmap(newhashmap()); 地图。添加(“aa”、“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);
}
}
公共类UpperCaseHashMap扩展了HashMap{
/**
*
*/
私有静态最终长serialVersionUID=1L;
地图;
公共大写HashMap(){
map=新的HashMap();
}
UpperCaseHashMap(映射映射){
this.map=map;
}
公共V输入(K键,V值){
字符串temp=key.toString().toUpperCase();
键=(K)温度;
返回super.put(键、值);
}
}
公共类AddHashMap扩展了HashMap{
/**
*
*/
私有静态最终长serialVersionUID=1L;
地图;
AddHashMap(映射映射){
this.map=map;
}
公共V输入(K键,V值){
字符串temp=key.toString().concat(“由装饰器添加”);
键=(K)温度;
返回super.put(键、值);
}
}
实现2:--结果映射为空
公共类AddHashMapImpl2扩展HashMapDecorator{
/**
*
*/
私有静态最终长serialVersionUID=1L;
地图;
AddHashMapImpl2(映射){
this.map=map;
}
公共V输入(K键,V值){
字符串temp=key.toString().concat(“由装饰器添加”);
键=(K)温度;
返回map.put(键、值);
}
}
公共类UpperCaseHashMapImpl2扩展了HashMapDecorator{
/**
*
*/
私有静态最终长serialVersionUID=1L;
地图;
公共大写HashMapImpl2(){
map=新的HashMap();
}
大写HashMapImpl2(映射){
this.map=map;
}
公共V输入(K键,V值){
字符串temp=key.toString().toUpperCase();
键=(K)温度;
返回map.put(键、值);
}
}您的产品线:
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);
}
}
@functioninterface
接口映射装饰器{
V(V值);
}
类DecoratedMap扩展了HashMap{
private final List decorators=new ArrayList();
公共void addDecorator(MapDecorator decorator){
添加(decorator);
}
@凌驾
公共V输入(K键,V值){
for(地图装饰器装饰器:装饰器)
value=decorator.decoration(value);
返回super.put(键、值);
}
}
我在这段代码中使用了“decorator”来匹配您的原始问题,但实际上,这并不是使用decorator设计模式,所以,实际上,我会使用不同的名称,如“transformer”。装饰设计模式取决于子分类-提供的示例似乎使用访客设计模式是的,地图是空的,原因是我在回答中给出的:您只转发
put
。您需要转发每种方法。这将破坏HashMap子类化的目的。你能建议一些方法吗。另外,你可以编辑你的答案(任何内容)以便我可以投票给你的答案吗
return map.put(key, value);
@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);
}
}