网站开发qq头像免费app制作平台下载

当前位置: 首页 > news >正文

网站开发qq头像,免费app制作平台下载,郑州网站开发汉狮,昆明网站建设云集创目录 10、享元模式10.1 享元模式10.2 举例10.2.1 马赛克10.2.2 游戏地图#xff08;以草原地图作为范例#xff09; 10.3 总结 10、享元模式 10.1 享元模式 “享元”则是共享元件的意思享元模式的英文flyweight是轻量级的意思#xff0c;这就意味着享元模式能使程序变得更… 目录 10、享元模式10.1 享元模式10.2 举例10.2.1 马赛克10.2.2 游戏地图以草原地图作为范例 10.3 总结 10、享元模式 10.1 享元模式 “享元”则是共享元件的意思享元模式的英文flyweight是轻量级的意思这就意味着享元模式能使程序变得更加轻量化当系统存在大量的对象并且这些对象又具有相同的内部状态时我们就可以用享元模式共享相同的元件对象以避免对象泛滥造成资源浪费。测试类结构
10.2 举例 10.2.1 马赛克 虽然马赛克小块数量比较多但经过观察我们会发现分析组成进行归类后找到元件只有4种黑色块、灰色块、灰白色块以及白色块。我们可以说这就是4个“元”色块 10.2.2 游戏地图以草原地图作为范例 对组成部分进行归类分析找到原件 游戏地图都是由一个个小的单元图块组成的其中除房屋比较大之外其他图块的尺寸都一样它们分别为河流、草地、道路这些图块便是4个元图块 分析建模 定义一个图块类来描述图块具体属性应该包括“图片”和“位置”信息并且具备按照这些信息去绘制图块的能力Segment package flyweight;/*** Description 图块类/ public class Segment {/** 材质图/private String image;/** 位置坐标/private int x,y;/** 显式带参构造方法初始化各参数* param image 材质图* param x 横坐标* param y 纵坐标/public Segment(String image, int x, int y) {this.image image;System.out.println(从磁盘加载[ image ]图片……);this.x x;this.y y;}/** 图块绘制方法按坐标位置绘制在地图上*/public void draw() {System.out.println(在位置[ x : y ]上绘制图片[ image ]);} }在地图第一行随便绘制一些图块,Client.test1() 在这一步会发现图片加载很慢一张图片加载要半秒10张图块就要耗费5秒影响用户体验 package flyweight;/** *Description 测试类 */ public class Client {private static void test1() {//在地图第一行随便绘制一些图块new Segment(河流, 10, 10).draw();new Segment(河流, 10, 20).draw();new Segment(道路, 10, 30).draw();new Segment(草地, 10, 40).draw();new Segment(草地, 10, 50).draw();new Segment(草地, 10, 60).draw();new Segment(草地, 10, 70).draw();new Segment(草地, 10, 80).draw();new Segment(道路, 10, 90).draw();new Segment(道路, 10, 100).draw();} }图片与坐标状态初始化后就固定下来了简单讲就是被绘制出来后就不必变动了即使要变也是将拼好的地图作为一个大对象整体挪动 图件共享优化 继续分析每个图块的坐标是不同的但有很大一部分图块的材质图图片是相同的于是我们可以得出结论材质图是可以作为享元的而坐标则不能既然要共享相同的图片那么我们就得将图块类按图片拆分成更细的材质类如河流类、草地类、道路类等而坐标不能作为图块类的享元属性所以我们就得设法把这个属性抽离出去由外部负责代码实战 首先需要定义一个接口规范这些材质类的绘图标准接口规范标准Drawable 当然除了接口方式我们还可以用抽象类抽离出更多的属性和方法使子类变得更加简单 package flyweight; /**

  • Description 绘图接口: 规范这些材质类的绘图标准
  • 当然除了接口方式我们还可以用抽象类抽离出更多的属性和方法使子类变得更加简单 */ public interface DrawAble { /**
  • 绘图方法接收地图坐标
  • param x 横坐标
  • param y 纵坐标 / void draw(int x, int y); }定义一系列材质类并实现此绘图接口 河流类River package flyweight.texture; import flyweight.DrawAble; /** Description 河流类/ public class River implements DrawAble {/** 享元属性 河流图片材质作为内部属性/private String image;/** 类构造器中加载河流图片* 这就是类内部即将共享的“元”数据了我们通常称之为“内蕴状态”/public River() {this.image 河流;System.out.print(从磁盘加载[ image ]图片耗时……);}/** 重写绘图方法* 而作为“外蕴状态”的坐标是无法作为享元的由外部传入* param x 横坐标* param y 纵坐标/Overridepublic void draw(int x, int y) {System.out.println(在位置[ x : y ]上绘制图片[ image ]);} }草地类Grass package flyweight.texture;import flyweight.DrawAble;/** Description 草地类/public class Grass implements DrawAble {/** 享元属性草地图片材质/private String image;public Grass() {this.image 草地;System.out.print(从磁盘加载[ image ]图片耗时……);}Overridepublic void draw(int x, int y) {System.out.println(在位置[ x : y ]上绘制图片[ image ]);}}道路类Road package flyweight.texture;import flyweight.DrawAble;/** Description 道路类/public class Road implements DrawAble {/** 道路图片材质/private String image;public Road() {this.image 道路;System.out.println(从磁盘加载[ image ]图片耗时…);}Overridepublic void draw(int x, int y) {System.out.println(在位置[ x : y ]上绘制图片[ image ]);}}房屋类House package flyweight.texture;import flyweight.DrawAble;/** Description 房屋类/public class House implements DrawAble {private String image;//房屋图片材质public House() {this.image 房屋;System.out.print(从磁盘加载[ image ]图片耗时……);}Overridepublic void draw(int x, int y) {System.out.print(将图层切换到顶层……);//房屋盖在地板上所以切换到顶层图层System.out.println(在位置[ x : y ]上绘制图片[ image ]);}}“元之共享”的关键: 定义一个图件工厂类 package flyweight.factory;import flyweight.DrawAble;import flyweight.texture.Grass;import flyweight.texture.House;import flyweight.texture.River;import flyweight.texture.Road;import java.util.HashMap;import java.util.Map;/** Description 图件工厂类/public class SegmentFactory {/** 图库: 维护着所有的图件元对象/private MapString, DrawAble images;public SegmentFactory() {images new HashMapString, DrawAble();}public DrawAble getDrawable(String image) {//缓存池里如果没有图件则实例化并放入缓存池if(!images.containsKey(image)){switch (image) {case 河流:images.put(image, new River());break;case 草地:images.put(image, new Grass());break;case 道路:images.put(image, new Road());break;case 房屋:images.put(image, new House());}}//至此缓存池里必然有图件直接取得并返回return images.get(image);}}并将各种图件对象提前放入内存中共享如此便可以避免每次从磁盘重新加载 测试Client.test2() private static void test2() {//先实例化图件工厂SegmentFactory factory new SegmentFactory();/** 随便绘制一列为例: 抛弃了利用“new”关键字随意制造对象的方法* 改用这个图件工厂类来构建并共享图件元外部需要什么图件直接向图件工厂索要即可*/factory.getDrawable(河流).draw(10, 10);factory.getDrawable(河流).draw(10, 20);factory.getDrawable(道路).draw(10, 30);factory.getDrawable(草地).draw(10, 40);factory.getDrawable(草地).draw(10, 50);factory.getDrawable(草地).draw(10, 60);factory.getDrawable(草地).draw(10, 70);factory.getDrawable(草地).draw(10, 80);factory.getDrawable(道路).draw(10, 90);factory.getDrawable(道路).draw(10, 100);//绘制完地板后接着在顶层绘制房屋factory.getDrawable(房子).draw(10, 10);factory.getDrawable(房子).draw(10, 50);}小结 相同部分可以作为享元如在构造器中加载的作为内部类即将共享的元数据通常称为“内蕴状态”不同部分不能作为享元如在实现房中作为参数传入的属性称为“外蕴状态”
    10.3 总结 享元模式让图件对象将可共享的内蕴状态“图片”维护起来将外蕴状态“坐标”抽离出去并定义于接口参数中基于此享元工厂便可以顺利将图件对象共享以供外部随时使用。享元模式的各角色定义如下 Flyweight享元接口所有元件的高层规范声明与外蕴状态互动的接口标准。如DrawAble。ConcreteFlyweight享元实现 享元接口的元件实现类自身维护着内蕴状态且能接受并响应外蕴状态可以有多个实现。如河流类River、草地类Grass、道路类Road等。一个享元对象可以被称作一个“元” FlyweightFactory享元工厂用来维护享元对象的工厂负责对享元对象实例进行创建与管理并对外提供获取享元对象的服务。SegmentFactoryClient客户端享元的使用者负责维护外蕴状态。Client “享元”的理念其实就是萃取事物的本质将对象的内蕴状态与外蕴状态剥离开来其中内蕴状态成为真正的“元”数据而外蕴状态则被抽离出去由外部负责维护