[关键字]:java,design pattern,设计模式,《Java与模式》学习,Flyweight Pattern,享元模式
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com) http://wintys.blogjava.net
[正文]:
享元模式-复合享元:
package pattern.flyweight.unsharable;
import java.util.*;
/**
* 复合的享元模式:
* 复合享元是不能共享的,所以叫Unsharable Flyweight。
* 但是复合享元是可以分解为可共享的单纯享元。
*
* @version 2009-6-25
* @author Winty(wintys@gmail.com)
*/
public class UnsharableFlyweightTest{
public static void main(String[] args){
FlyweightFactory f = new FlyweightFactory();
Flyweight fly = f.factory("aba");
fly.operation("ex");
f.checkFlyweight();
}
}
/**
* 抽象享元
*/
abstract class Flyweight{
public abstract void operation(String extrinsicState);
}
/**
* 具体享元
*/
class ConcreteFlyweight extends Flyweight{
private Character intrinsicState;
public ConcreteFlyweight(Character intrinsicState){
this.intrinsicState = intrinsicState;
}
/**
* 外蕴状态改变方法行为,但不会改变内蕴状态
*/
@Override
public void operation(String extrinsicState){
String str = "intrinsic:" + intrinsicState;
str += " extrinsic:" + extrinsicState;
System.out.println(str);
}
}
/**
* 复合享元
*/
class UnsharableFlyweight extends Flyweight{
private Map<Character , Flyweight> map;
public UnsharableFlyweight(){
map = new HashMap<Character , Flyweight>();
}
public void add(Character c , Flyweight fly){
map.put(c , fly);
}
@Override
public void operation(String extrinsicState){
Iterator<Map.Entry<Character , Flyweight>> it
= map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<Character , Flyweight> entry = it.next();
Flyweight fly = entry.getValue();
fly.operation(extrinsicState);
}
}
}
/**
* 享元工厂
*/
class FlyweightFactory{
private Map<Character , Flyweight> map;
public FlyweightFactory(){
map = new HashMap<Character , Flyweight>();
}
/**
* 单纯享元工厂
*/
public Flyweight factory(Character state){
Flyweight flyweight = null;
if(map.containsKey(state)){
flyweight = map.get(state);
}
else{
flyweight = new ConcreteFlyweight(state);
map.put(state , flyweight);
}
return flyweight;
}
/**
* 复合享元工厂
* 此处Character的复合类型恰好是String,
* 当无此巧合时,可使用List等聚集类型传入.
*/
public Flyweight factory(String compositeState){
UnsharableFlyweight composite = new UnsharableFlyweight();
for(int i = 0 ; i < compositeState.length(); i++){
Character c = new Character(compositeState.charAt(i));
composite.add(c , this.factory(c));
}
return composite;
}
/**
* 辅助方法
*/
public void checkFlyweight(){
Iterator<Map.Entry<Character , Flyweight>> it
= map.entrySet().iterator();
System.out.println("check flyweight:");
while(it.hasNext()){
Map.Entry<Character , Flyweight> entry = it.next();
Character key = entry.getKey();
System.out.println("key:" + key);
}
}
}
运行结果:
intrinsic:b extrinsic:ex
intrinsic:a extrinsic:ex
check flyweight:
key:b
key:a
- 大小: 64.5 KB
分享到:
相关推荐
设计模式之享元模式的两种实现方式——单纯享元模式和复合享元模式,已经各种的UML类设计图
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
b) 复合享元模式这种享元模式中的有些享元对象是由一些单纯享元对象组合而成的,它们就是复合享元对象。虽然复合享元对象本身不能共享,但它们可以分解成单纯享元对象再被共享,其结构图如图。 享元模式可以帮助...
复合模式又叫部分-整体模式(Part-Whole)。将对象组织成树型结构(周氏家族图),可以用来描述整体与部分的关系,使客户端将单纯元素与复合元素同等
sqlserver 2005 主外键-复合主键案例
电信设备-复合材料失效模式信息输出方法及装置.zip
行业文档-设计装置-复合平台.zip
行业分类-设备装置-复合笔.zip
行业文档-设计装置-复合棉纸.zip
行业文档-设计装置-复合壁纸.zip
导数--复合函数的导数练习题.pdf
行业分类-设备装置-复合转移纸的复合转移方法及设备.zip
行业文档-设计装置-复合保温墙体.zip
行业文档-设计装置-复合包装纸板.zip
行业文档-设计装置-复合热敏卡纸.zip
行业文档-设计装置-复合防水壁纸.zip
行业文档-设计装置-复合磁性镇纸.zip
行业文档-设计装置-复合磁性墙纸.zip
电子政务-复合型精密电子元器件.zip
行业分类-设备装置-复合书写用具.zip