当前位置: 首页 > 知识库问答 >
问题:

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

仲孙才捷
2023-03-14

我正在尝试为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_DECROATOR=AA}

    map map=new UpperCaseHashMap<>(new AddHashMap<>(new HashMap<>()));Map.Add(“AA”、“AA”);system.out.println(地图);

    下面是装修师类的代码:-

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

    }

  • 共有1个答案

    秦弘亮
    2023-03-14

    您的行:

    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的类型是