享元模式-AbstractMap结构

享元模式: 共享数据的模式。

例子:创建定制的Map-->FlyweightMap.

1. 默认填充DATA元数据,避免每次使用FlyweightMap时创建新的数据。

2. Map的数据结构

package designpattern.flyweight;

import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Countries {
	
	//元数据
	public static final String[] [] DATA = {{"CHINA", "BeiJing"},{"AMERICA", "Washington"},
		{"Canada", "canada"}, {"Japan", "dongjing"},
		{"Australia", "Sydney"}, {"Korea", "souer"}};
	
	private static class FlyweightMap extends AbstractMap<String, String> {
		
		private static Set<Map.Entry<String, String>> entries = new EntrySet(DATA.length);
		
		@Override
		public Set<Map.Entry<String, String>> entrySet() {
			return entries;
		}
		
		//定制的Entry,访问元数据
		private static class Entry implements Map.Entry<String, String> {
			
			int index;
			
			Entry(int index) {
				this.index = index;
			}

			@Override
			public int hashCode() {
				return DATA[index][0].hashCode();
			}

			@Override
			public boolean equals(Object obj) {
				return DATA[index][0].equals(obj);
			}

			@Override
			public String getKey() {
				return DATA[index][0];
			}

			@Override
			public String getValue() {
				return DATA[index][1];
			}

			@Override
			public String setValue(String arg0) {
				throw new UnsupportedOperationException();
			}
			
		}
		
		//定制的EntrySet,访问定制的Entry
		static class EntrySet extends AbstractSet<Map.Entry<String, String>> {
			
			private int size;
			
			public EntrySet(int size) {
				if(size < 0) {
					size = 0;
				} else if(size > DATA.length) {
					size = DATA.length;
				}
				this.size = size;
			}
			
			@Override
			public Iterator<Map.Entry<String, String>> iterator() {
				return new Iter();
			}

			@Override
			public int size() {
				return size;
			}
			
			private class Iter implements Iterator<Map.Entry<String, String>> {
				
				//该Entry访问元数据
				private Entry entry = new Entry(-1);
				
				@Override
				public boolean hasNext() {
					return entry.index < size-1;
				}

				@Override
				public Map.Entry<String, String> next() {
					entry.index ++;
					return entry;
				}

				@Override
				public void remove() {
					throw new UnsupportedOperationException();
				}

			}
			
		}
		
	}
	
	
	static Map<String, String> select(final int size) {
		return new FlyweightMap() {
			@Override
			public Set<java.util.Map.Entry<String, String>> entrySet() {
				return new EntrySet(size);
			}
		};
	}
	
	static Map<String, String> map = new FlyweightMap();
	
	public static Map<String, String> capitals() {
		return map;
	}
	
	public static Map<String, String> capitals(int size) {
		return select(size);
	}
	
	static List<String> names = new ArrayList<String>(map.keySet());
	
	public static List<String> names() {
		return names;
	}
	
	public static List<String> names(int size) {
		return new ArrayList<String>(select(size).keySet());
	}
	
	public static void main(String[] args) {
		System.out.println(capitals(10));
		System.out.println(names(10));
		System.out.println(new HashMap<String, String>(capitals(3)));
		System.out.println(new LinkedHashMap<String, String>(capitals(3)));
		
	}
}
//output
{CHINA=BeiJing, AMERICA=Washington, Canada=canada, Japan=dongjing, Australia=Sydney, Korea=souer}
[CHINA, AMERICA, Canada, Japan, Australia, Korea]
{Canada=canada, CHINA=BeiJing, AMERICA=Washington}
{CHINA=BeiJing, AMERICA=Washington, Canada=canada}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AbstractMap是Java集合框架中的一个抽象类,它实现了Map接口。在AbstractMap类中,只有一个抽象方法:entrySet(),该方法返回一个包含Map中所有键值对的Set集合。 AbstractMap类内部还包含了操作子元素的实体接口Entry,通过Entry的视图实现,AbstractMap类可以对元素进行操作。 通过继承AbstractMap类,我们可以轻松地实现自定义的Map类,并根据需要重写其中的方法。AbstractMap在Java集合中扮演着重要的角色,它提供了一些基本的实现,方便我们自定义具体的Map类。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java常用数据结构Map-AbstractMap](https://blog.csdn.net/weixin_33957648/article/details/87959196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java集合类:AbstractMap](https://blog.csdn.net/yeyazhishang/article/details/83097059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [详解Java中AbstractMap抽象类](https://download.csdn.net/download/weixin_38554781/12763008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值