《JAVA与模式》第11天―享元模式 (三)

2014-11-24 08:24:28 · 作者: · 浏览: 3
统中是否已经有 一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个 合适的享元对象。

源代码
  抽象享元角色类

[java]
package com.bankht.Flyweight.complex;

/**
* @author: 特种兵—AK47
* @创建时间:2012-6-26 下午02:16:25
*
* @类说明 :抽象享元角色类
*/
public interface Flyweight {
// 一个示意性方法,参数state是外蕴状态
public void operation(String state);
}
package com.bankht.Flyweight.complex;

/**
* @author: 特种兵—AK47
* @创建时间:2012-6-26 下午02:16:25
*
* @类说明 :抽象享元角色类
*/
public interface Flyweight {
// 一个示意性方法,参数state是外蕴状态
public void operation(String state);
}

  具体享元角色类

[java]
package com.bankht.Flyweight.complex;

/**
* @author: 特种兵—AK47
* @创建时间:2012-6-26 下午02:16:50
*
* @类说明 :具体享元角色类
*/
public class ConcreteFlyweight implements Flyweight {
private Character intrinsicState = null;

/**
* 构造函数,内蕴状态作为参数传入
*
* @param state
*/
public ConcreteFlyweight(Character state) {
this.intrinsicState = state;
}

/**
* 外蕴状态作为参数传入方法中,改变方法的行为, 但是并不改变对象的内蕴状态。
*/
@Override
public void operation(String state) {
// TODO Auto-generated method stub
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("Extrinsic State = " + state);
}

}
package com.bankht.Flyweight.complex;

/**
* @author: 特种兵—AK47
* @创建时间:2012-6-26 下午02:16:50
*
* @类说明 :具体享元角色类
*/
public class ConcreteFlyweight implements Flyweight {
private Character intrinsicState = null;

/**
* 构造函数,内蕴状态作为参数传入
*
* @param state
*/
public ConcreteFlyweight(Character state) {
this.intrinsicState = state;
}

/**
* 外蕴状态作为参数传入方法中,改变方法的行为, 但是并不改变对象的内蕴状态。
*/
@Override
public void operation(String state) {
// TODO Auto-generated method stub
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("Extrinsic State = " + state);
}

}

  复合享元对象是由单纯享元对象通过复合而成的,因此它提供了add()这样的聚集管理方法。由于一个复合享元对象具有不同的聚集元素,这些聚集元素在复合享元对象被创建之后加入,这本身就意味着复合享元对象的状态是会改变的,因此复合享元对象是不能共享的。

  复合享元角色实现了抽象享元角色所规定的接口,也就是operation()方法,这个方法有一个参数,代表复合享元对象的外蕴状态。一个复合享元对象的所有单纯享元对象元素的外蕴状态都是与复合享元对象的外蕴状态相等的;而一个复合享元对象所含有的单纯享元对象的内蕴状态一般是不相等的,不然就没有使用价值了。

[java]
package com.bankht.Flyweight.complex;

import java.util.HashMap;
import java.util.Map;

/**
* @author: 特种兵—AK47
* @创建时间:2012-6-26 下午02:17:16
*
* @类说明 :
*/
public class ConcreteCompositeFlyweight implements Flyweight {

private Map files = new HashMap();

/**
* 增加一个新的单纯享元对象到聚集中
*/
public void add(Character key, Flyweight fly) {
files.put(key, fly);
}

/**
* 外蕴状态作为参数传入到方法中
*/
@Override
public void operation(String state) {
Flyweight fly = null;
for (Object o : files.keySet()) {
fly = files.get(o);
fly.operation(state);
}

}

}
package com.bankht.Flyweight.complex;

import java.util.HashMap;
import java.util.Map;

/**
* @author: 特种兵—AK47
* @创建时间:2012-6-26 下午02:17:16
*
* @类说明 :
*/
public class ConcreteCompositeFlyweight implements Flyweight {

private Map files = new HashMap();

/**
* 增加一个新的单纯享元对象到聚集中
*/
public void add(Character key, Flyweight fly) {
files.put(key, fly);
}

/**
* 外蕴状态作为参数传入到方法中
*/
@Override
public void operation(String state) {
Flyweight fly = null;
for (Object o : files.keySet()) {
fly = files.get(o);
fly.operation(state);
}

}

}

  享