转载请注明出处:http://blog.csdn.net/ljmingcom304/article/details/50461987
本文出自:【梁敬明的博客】
享元模式区分内蕴状态和外蕴状态,其中内蕴状态是共性,外蕴状态是特性。抽象享元角色规定了享元角色必须实现的方法,在此方法中外蕴状态以参数的形式传入。
public interface Flyweight {
void operation(String eState);
}
实现抽象享元角色的方法,如果存在内蕴状态,并负责为内蕴状态提供存储空间。
public class ConcreteFlyweight implements Flyweight {
private String iState = null;
public ConcreteFlyweight(String iState) {
this.iState = iState;
}
@Override
public void operation(String eState) {
System.out.println("内蕴状态:" + this.iState);
System.out.println("外蕴状态:" + eState);
}
}
所包含的对象是不可共享的,并可以分解成多个单纯享元对象的组合。
public class ConcreteCompositeFlyweight implements Flyweight{
private Map map = new HashMap();
public void add(String key,Flyweight flyweight){
map.put(key, flyweight);
}
@Override
public void operation(String eState) {
Flyweight flyweight = null;
for (String key : map.keySet()) {
flyweight = map.get(key);
flyweight.operation(eState);
}
}
}
负责创建和管理享元角色,达到对象共享的目的。
public class FlyweightFactory {
private Map map = new HashMap();
//复合享元
public Flyweight create(List iStates){
ConcreteCompositeFlyweight ccf = new ConcreteCompositeFlyweight();
for (String iState : iStates) {
ccf.add(iState, this.create(iState));
}
return ccf;
}
//单纯享元
public Flyweight create(String iState){
Flyweight flyweight = map.get(iState);
if(flyweight==null){
flyweight = new ConcreteFlyweight(iState);
map.put(iState, flyweight);
}
return flyweight;
}
}
通过享元工厂角色来创建和管理享元角色,并设置享元角色的内蕴状态与外蕴状态。
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
// 具体享元角色
Flyweight weight1 = factory.create("A");
weight1.operation("A1");
Flyweight weight2 = factory.create("B");
weight2.operation("B1");
Flyweight weight3 = factory.create("A");
weight3.operation("A2");
// 复合享元角色
ArrayList list = new ArrayList();
list.add("baidu");
list.add("google");
Flyweight weight4 = factory.create(list);
weight4.operation("network");
}
}