前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在王者荣耀角度下分析面向对象程序设计B中23种设计模式之享元模式

在王者荣耀角度下分析面向对象程序设计B中23种设计模式之享元模式

作者头像
荣仔_最靓的仔
发布2021-02-02 17:35:19
2620
发布2021-02-02 17:35:19
举报

·

享元模式在王者荣耀中的应用

·

在这里插入图片描述
在这里插入图片描述

一、简述

在王者荣耀中,有许多英雄,每个英雄属于自己的皮肤。在玩家玩这款游戏时,可以根据自己的喜好以及打法习惯,使得不同的英雄、皮肤、铭文等随意配对,体验不一样的乐趣。

在本实例中,我们就通过上述内容描述怎样使用享元模式。创建若干个英雄“百里守约”。其中“百里守约”名称以及三个技能名称是相同的;铭文和皮肤选配是不同的。

二、享元模式(Flyweight Pattern)

享元模式理解: 高度概括:运用共享技术有效的支持大量细粒度的对象。 一个类中的成员变量表明,该类所创建对象所具有的属性,在某些程序设计中,可能一个类创建若干个对象,但是发现这些对象的一个共同特点是他们有一部分属性的取值必须是完全相同的。 享元模式的关键是使用一个称作享元的对象,为其他对象提供共享的状态,而且能够保证使用享元的对象不能更改向享元的数据。从享元的角度来看,享元所维护的数据习惯上称作享元的内部状态,而使用享元的对象或应用程序中所维护的其他数据,称作享元的外部状态,外部状态往往具有不可预见性,可能需要动态的计算来确定使用享元的对象,或应用程序在必要的时候,可以将外部状态传递给享元的方法中的参数及作为享元中方法调用的参数传入,也就是说,享元对象将其成员变量,看作是自己所维护内部状态,而将它的方法的参数看做是自己能得到的外部状态。

享元模式结构中的三种角色: ①享元接口(Flyweight):是一个接口,该接口定义了享元对外公开其内部数据的方法,以及享元接收外部数据的方法; ②具体享元(Concrete Flyweight):实现享元接口的类,该类的实例称作为享元对象或简称享元。具体享元类的成员变量为享元对象的内部状态,显然,对象的内部状态必须与所处的周围环境无关。即要保证使用享元对象的应用程序无法更改享元的内部状态,只有这样才能使得享元对象在系统中被共享,因为享元对象是用来共享的,所以不能允许用户各自的使用具体享元来创建对象,这样就无法达到共享的目的,因为不同用户用具体享元类创建的对象显然是不同的,所以具体享元类的构造方法必须是private的,其目的是不允许用户程序直接使用,具体享元类来创建享元对象,创建和管理享元对象有享元工厂负责; ③享元工厂(Flyweight Factory):享元工厂是一个类,该类的实例负责创建和管理享元对象,用户或其他对象必须请求享元工厂为它得到一个享元对象。享元工厂可以通过一个散列表,也称作共享池来管理享元对象,当用户程序或其他若干个对象向享元工厂请求一个享元对象时,如果想让工厂的散列表中已有这样的享元对象,享元工厂就提供这个享元对象给请求者,否则就创建一个享元对象,添加到散列表中,同时将该享元对象提供给请求者,显然当若干个用户或对象,请求享元工厂提供一个享元对象时,第一个用户获得该享元对象的时间可能慢一些,但是后记的用户会比较快的获得这个对象,可以使用单列模式来设计享元工厂,即让系统中只有一个享元工厂的实例,另外,为了让享元工厂能生成享元对象,需要将具体享元类作为享元工厂的内部类。

享元模式的UML类图:

在这里插入图片描述
在这里插入图片描述

享元模式的优缺点: 优点: ①使用享元可以节省内存的开销,特别适合处理大量细粒度对象,这些对象的许多属性值是相同的,而且一旦创建则不允许修改; ②享元模式中的享元可以使用方法的参数接受外部的状态中的数据,但外部状态数据不会干扰到享元中的内部数据,这就使享元可以在不同的环境中被共享; 缺点: ①使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序逻辑复杂化; ②为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。

享元模式的适用情景: ①一个应用程序使用大量的对象,这些对象之间部分属性本质上是相同的,这时应使用享元来封装相同的部分; ②对象的多数状态都可变为外部状态,就可以考虑将这样对象作为系统中的享元来使用; ③使用享元模式需要维护一个存储享元对象的享元池,而这需要耗费资源,因此,应当在多次重复使用享元对象时才值得使用享元模式。

三、王者荣耀角度下实现享元模式结构图及代码

eclipse结构图

在这里插入图片描述
在这里插入图片描述

主函数【应用(Application)】 Applicayion.java

代码语言:javascript
复制
package angle_flyweightPattern;

import angle_flyweightPattern.Hero;
import angle_flyweightPattern.Flyweight;
import angle_flyweightPattern.FlyweightFactroy;

public class Application{
    public static void main(String args[]) {
          FlyweightFactroy  factroy=FlyweightFactroy.getFactroy();
          String oneSkill = "静谧之眼",twoSkill = "狂风之息",threeSkill = "逃脱";
          String key=""+oneSkill+"#"+twoSkill+"#"+threeSkill;
          Flyweight flyweight=factroy.getFlyweight(key);
          Hero audiA6One=new Hero(flyweight,"百里守约","特工魅影 ","百穿铭文");
          Hero audiA6Two=new Hero(flyweight,"百里守约","朱雀志    ","吸血铭文");
          Hero audiA6Three=new Hero(flyweight,"百里守约","朱雀志    ","吸血铭文");
          audiA6One.print();
          audiA6Two.print();
          audiA6Three.print();
          Hero audiA4One=new Hero(flyweight,"百里守约","绝影神枪","百穿铭文");
          Hero audiA4Two=new Hero(flyweight,"百里守约","特工魅影","百穿铭文");
          flyweight.printMess(" 英雄:百里守约 皮肤:绝影神枪  铭文:百穿铭文"); // 向享元传递外部数据
          flyweight.printMess(" 英雄:百里守约 皮肤:朱雀志     铭文:百穿铭文");
    }
} 

Hero.java

代码语言:javascript
复制
package angle_flyweightPattern;

import angle_flyweightPattern.Flyweight;

public class Hero{
    Flyweight  flyweight;    //存放享元对象的引用
    String name,skin,inscription;
    Hero(Flyweight  flyweight,String name,String skin,String inscription){
          this.flyweight=flyweight;
          this.name=name;
          this.skin=skin;
          this.inscription=inscription;
    }
   public void print(){
         System.out.print(" 英雄:"+name);
         System.out.print(" 皮肤:"+skin);
         System.out.print(" 铭文:"+inscription); 
         System.out.print("  一技能:"+flyweight.getOneSkill());
         System.out.print("  二技能:"+flyweight.getTwoSkill());
         System.out.println("  三技能:"+flyweight.getThreeSkill());
        
   }
} 

享元接口(Flyweight) Flyweight.java

代码语言:javascript
复制
package angle_flyweightPattern;

public interface Flyweight{
    public String getOneSkill();
    public String getTwoSkill();
    public String getThreeSkill();
    public void printMess(String mess);
}

享元工厂(FlyweightFactory) FlyweightFactroy.java

代码语言:javascript
复制
package angle_flyweightPattern;

import java.util.HashMap;

public class FlyweightFactroy{
       private   HashMap<String,Flyweight>  hashMap;
       static  FlyweightFactroy factroy=new FlyweightFactroy();
       private FlyweightFactroy(){
             hashMap=new HashMap<String,Flyweight>();
       }
       public static FlyweightFactroy getFactroy(){
             return factroy;
       }
       public synchronized Flyweight getFlyweight(String key){
            if(hashMap.containsKey(key))
                       return hashMap.get(key);
            else{ 
            	      String oneSkill,twoSkill,threeSkill;
                      String[] str=key.split("#");
                      oneSkill=str[0];
                      twoSkill=str[1];
                      threeSkill=str[2];
                      Flyweight ft=new ConcreteFlyweight(oneSkill,twoSkill,threeSkill);
                      hashMap.put(key,ft);
                      return ft;
            } 
       }
       class ConcreteFlyweight implements Flyweight{
             private String oneSkill;
             private String twoSkill;
             private String threeSkill; 
             private ConcreteFlyweight(String oneSkill,String twoSkill,String threeSkill){
                   this.oneSkill=oneSkill;
                   this.twoSkill=twoSkill;
                   this.threeSkill=threeSkill;
            }
            public String getOneSkill(){
                   return oneSkill;
            }
            public String getTwoSkill(){
                   return twoSkill;
            }
            public String getThreeSkill(){
                   return threeSkill;
           }
           public void printMess(String mess){
                 System.out.print(mess);        //输出外部数据mess
                 System.out.print("  一技能:"+oneSkill);  //输出内部数据width
                 System.out.print("  二技能:"+twoSkill);
                 System.out.println("  三技能:"+threeSkill);
           }
      }
}

运行结果截图

在这里插入图片描述
在这里插入图片描述

更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏

欢迎留言,一起学习交流~

感谢阅读

END

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ·
  • 享元模式在王者荣耀中的应用
  • ·
  • 一、简述
  • 二、享元模式(Flyweight Pattern)
  • 三、王者荣耀角度下实现享元模式结构图及代码
  • 欢迎留言,一起学习交流~
  • END
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档