`

[原]享元模式-复合享元

阅读更多

[关键字]: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
分享到:
评论

相关推荐

    设计模式之享元模式

    享元模式分为两种主要实现方式:单纯享元模式和复合享元模式。 1. 单纯享元模式: 在单纯享元模式中,享元对象只包含不可变的状态,也就是那些不能由客户端改变的状态。这部分状态通常称为内蕴状态(Intrinsic ...

    java设计模式-复合模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    Java享元模式

    享元模式分为两种形式:单纯享元模式和复合享元模式。 - 单纯享元模式:所有的享元对象都是可共享的,没有不可共享的状态。在单纯享元模式中,所有具体享元类的对象都可以被复用,降低了内存占用。 - 复合享元模式...

    享元模式1

    b) 复合享元模式这种享元模式中的有些享元对象是由一些单纯享元对象组合而成的,它们就是复合享元对象。虽然复合享元对象本身不能共享,但它们可以分解成单纯享元对象再被共享,其结构图如图。 享元模式可以帮助...

    学习php设计模式 php实现享元模式(flyweight)

    - 组合模式(Composite):复合享元模式实际上是单纯享元模式与合成模式的组合,允许树叶节点作为单纯享元对象进行共享,而树枝节点作为复合享元对象存在。 六、享元模式PHP示例代码 在PHP中实现享元模式的示例代码...

    12-复合模式.pdf

    ### 复合模式详解 #### 一、复合模式概述 复合模式(Composite Pattern),也称为部分-整体模式(Part-Whole Pattern),是一种结构型设计模式。它的主要目的是将多个简单的对象组合成一个复杂的对象,从而形成一...

    深入浅出设计模式之复合模式

    根据提供的信息,我们可以了解到本文主要关注的是《Head First 设计模式》一书中关于“复合模式”的相关内容。虽然未提供具体章节的内容,但基于标题、描述和标签,我们可以深入探讨复合模式的基本概念、应用场景...

    电子政务-复合型精密电子元器件.zip

    电子政务-复合型精密电子元器件.zip

    行业文档-设计装置-复合底纸单向透视膜.zip

    4. **工艺流程**:可能包含复合底纸和单向透视膜的生产流程,包括原材料选择、加工工艺、质量控制等环节。 5. **案例分析**:提供实际的设计案例,展示如何将这两种材料成功应用于实际项目中,以供读者学习和借鉴。...

    05.hive数据类型--复合类型--map类型的使用.mp4

    05.hive数据类型--复合类型--map类型的使用.mp4

    行业分类-设备装置-复合学习书具.zip

    行业分类-设备装置-复合学习书具.zip

    06.hive数据类型--复合类型--struct结构类型的使用.mp4

    06.hive数据类型--复合类型--struct结构类型的使用.mp4

    行业分类-设备装置-复合笔.zip

    标题中的“行业分类-设备装置-复合笔.zip”暗示了这个压缩包可能包含与设备装置相关的技术资料,特别是关于复合笔这种特殊设备的信息。复合笔通常指的是具备多种功能的书写工具,例如结合了钢笔、圆珠笔和铅笔等不同...

    机械优化设计-复合型法.pdf

    机械优化设计-复合型法.pdf

    电信设备-复合材料失效模式信息输出方法及装置.zip

    然而,在实际使用过程中,这些复合材料可能会出现不同的失效模式,包括疲劳、腐蚀、裂纹、环境老化、热应力等多种因素的影响,这些都可能引发设备故障,影响电信服务的质量和稳定性。因此,对电信设备中复合材料的...

    11-复合赋值运算符.py

    11-复合赋值运算符

    行业文档-设计装置-复合涂料纸[1].zip

    行业文档-设计装置-复合涂料纸[1].zip

    电子政务-复合电极.zip

    电子政务,全称为电子化政府服务,是利用现代信息技术,特别是互联网技术,来改革和优化政府运作模式,提高公共服务效率和质量的一种方式。在“电子政务-复合电极.zip”这个压缩包中,我们主要关注的是与电子政务...

Global site tag (gtag.js) - Google Analytics