flyweight - 对象结构型模式

    1.意图
     运用共享技术有效的支持大量细粒度的对象
     2.参与者
     Flyweight - 描述一个接口flyweight可以接受并作用于外部状态
     
     ConcreteFlyweight - 实现flyweight接口,并为内部状态增加存储空间。
     
     FlyweightFactory - 创建对象确保合理的共享对象   

3.结构

4.代码:

public interface Flyweight {
	Character getValue();
	int getTimes();
	void setTimes(int times);
}

public class ConcreteFlyweight implements Flyweight {
	private Character c ;
	private int times;
	ConcreteFlyweight(Character c){
		this.c=c;
	}
	public int getTimes() {
		return times;
	}
	public void setTimes(int times) {
		this.times = times;
	}
	@Override
	public Character getValue() {
		return c;
	}

}

public class CharacterObject {
	int rowNUm;
	int cloumnNum;
	ConcreteFlyweight concreteFlyweight;
	CharacterObject(Character c,int rowNUm,int cloumnNum){
		this.rowNUm = rowNUm;
		this.cloumnNum = cloumnNum;
		concreteFlyweight = (ConcreteFlyweight) FlyweightFactory.instance().getFlyweight(c);
		concreteFlyweight.setTimes(concreteFlyweight.getTimes()+1);
	}
	public ConcreteFlyweight getValue() {
		return concreteFlyweight;
	}

	public int getRowNum() {
		return rowNUm;
	}

	public int getCloumnNum() {
		return cloumnNum;
	}
}

public class FlyweightFactory {
	private final static FlyweightFactory flyweightFactory = new FlyweightFactory();
    private Map<Character,Flyweight> flyweightMap = new HashMap<Character,Flyweight>();
	public static FlyweightFactory instance() {
		return flyweightFactory;
	}

	private FlyweightFactory() {
	}
	public Flyweight getFlyweight(Character c){
		Flyweight o = flyweightMap.get(c);
		if(o == null ){
			o = new ConcreteFlyweight(c);
			flyweightMap.put(c, o);
		}
		return o;
	}
	public void __Time(Flyweight c ){
		c.setTimes(c.getTimes()-1);
	}
	public Iterator<Flyweight>  createIterator(){
		return flyweightMap.values().iterator();
	}
}

public class Article {
	List<List<CharacterObject>> article;

	Article() {
		article = new LinkedList<List<CharacterObject>>();
	}

	@SuppressWarnings("unused")
	public void add(char c, int row) {
		List<CharacterObject> list;
		int rows = article.size();
		if (rows <= row) {
			list = new LinkedList<CharacterObject>();
		} else {
			list = article.get(row);
		}
		int clounmn = list.size();
		CharacterObject characterObject = new CharacterObject(c, row, clounmn);
		list.add(characterObject);
		if (rows <= row) {
			article.add(row, list);
		} else {
			article.set(row, list);
		}

	}

	public void remove(int row, int clounmn) {
		if (article.size() < row) {
			throw new RuntimeException("不存在当前行,请确定后再删除!");
		}
		List<CharacterObject> list = article.get(row);
		if (list.size() < clounmn) {
			throw new RuntimeException("不存在当前列,请确定后再删除!");
		}
		ConcreteFlyweight f = list.get(clounmn).getValue();
		FlyweightFactory.instance().__Time(f);
		list.remove(clounmn);
	}
    public Iterator<List<CharacterObject>> Iterator(){
    	return article.iterator();
    }
}

public class ArticleDirector {
   public static Article getArticle(String articleStr){
	   char[] artiClechar = articleStr.toCharArray();
	   Article article = new Article();
	   int row = 0;
	   String flag = "/n";
	   char pre = 0;
	   for(char c:artiClechar){
		   if(c == '/'){
			   pre = c;
			   continue;
		   }else if('/'==pre && c == 'n'){
			   row ++ ;
			   pre = 0;
			   continue;
		   }else if(pre == '/'){
			   article.add(pre, row); 
			   article.add(c, row);
			   pre = 0;
		   }else{
			   article.add(c, row);
			   pre = 0;
		   }
		   
	   }
	   return article;
   } 
   
   public static void print(Article a) {
	   Iterator<List<CharacterObject>> it = a.Iterator();
	   while(it.hasNext()){
		   Iterator<CharacterObject> list = it.next().iterator();
		   while(list.hasNext()){
			   CharacterObject f = list.next();
			   System.out.print(f.getValue().getValue());
		   }
		   System.out.println();
	   }
	}
}

public class Client {
    public static void main(String[] args) {
    	Article  a = ArticleDirector.getArticle("adsdfadfs adfas adewfa /n dfadfaasdfwfqt /nreq erq eqreq/n");
    	ArticleDirector.print(a);
    	Iterator<Flyweight> it = FlyweightFactory.instance().createIterator();
    	while(it.hasNext()){
    		Flyweight  c = it.next();
    		System.out.println(c.getValue()+":"+c.getTimes());
    	}
    	a.remove(0, 0);
    	ArticleDirector.print(a);
    	it = FlyweightFactory.instance().createIterator();
    	while(it.hasNext()){
    		Flyweight  c = it.next();
    		System.out.println(c.getValue()+":"+c.getTimes());
    	}
    }
}

5.测试结果

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值