Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap返回空HashMap的装饰器设计模式_Java_Design Patterns_Hashmap_Decorator - Fatal编程技术网

Java HashMap返回空HashMap的装饰器设计模式

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

我正在尝试为HashMap实现Decorator设计模式

我有两个装饰程序-“UpperCaseHashMap”和“AddHashMap”

实施1:-

但是,结果映射仅包含其中一个装饰器的效果,例如:-

  • 只有AddHashMap效果,即结果是-{AA=AA}

    Map Map=newaddhashmap(newuppercasehashmap(newhashmap()); 地图。添加(“aa”、“aa”); 系统输出打印项次(map)

  • 只有UpperCaseHashMap效果,即结果是-{aaADDED_BY_DECORATOR=aa}

    Map Map=newuppercasehashmap(newaddhashmap(newhashmap()); 地图。添加(“aa”、“aa”); 系统输出打印项次(map)

下面是decorator类的代码:-

    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);
    }
}