·
适配器模式在王者荣耀中的应用
·
应用一:元歌通过傀儡假扮敌方的任意英雄
应用二:王者荣耀iOS与安卓互通
一、简述
简单来讲,适配器模式就是通过一个适配器将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
在第一个应用中,我方英雄元歌通过一技能操纵傀儡,可以在本体状态使用秘术影来突进目标,使其傀儡随机变成敌方英雄的样子,进而在一定程度上对敌方的判断进行干扰;当然在此情况下,元歌的傀儡不仅可以模仿敌方英雄的样子,还有其局内语音也可以被傀儡模仿。
我方元歌和敌方英雄本是不可互通其样式属性的,但在适配器“傀儡”的作用下可以实现此操作
在第二个应用中,因为资料不互通,所以对于那些在游戏中投入极多的玩家来说,如果需要换手机的话,这款游戏甚至会成为最后决定的一个因素。因为如果要换系统的话,不论是iOS转到安卓还是安卓转到iOS,因为游戏数据不互通,所以游戏都要重新玩起,以前的英雄皮肤铭文等统统不作数。为了避免玩家遭受到如此差的体验感,王者团队推出了平台互通功能,解决了一些玩家在这方面的苦恼。
iOS和安卓之间是不互通的,为了使两平台数据互通,就需要使用适配器将两平台搭建,实现数据互通功能
本例中应用Iterator接口与Enumeration接口
二、适配器模式(Adapter Pattern)
适配器模式理解:
高度概括:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式是将一个类的接口(被适配者)转换成客户希望的另外一个接口(目标)的成熟模式,该模式中设计有目标、被适配者和适配器。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并包含有被适配者的引用。
适配器模式结构中的三种角色:
·目标(Target):是一个接口,该接口是客户想使用的接口;
·被适配者(Adaptee):是一个已存在的接口或抽象类,这个接口或抽象类需要适配 ;
·适配器(Adapter):是一个类,该类实现了目标接口并包含有被适配者的引用(适配器的职责是对被适配者接口(抽象类)与目标接口进行适配)
适配器模式的UML类图:
适配器模式的优缺点:
优点:
①目标和被适配者是完全解耦关系;
②满足“开—闭原则”;
缺点:
其使用有一定的局限性,不能将一个适配者类和它的子类同时适配到目标接口
适配器模式的适用情景:
一个程序想使用已经存在的类,但该类所实现的接口和当前程序所使用的接口不一致。
三、王者荣耀角度下实现适配器模式结构图及代码
应用一:
实现此适配器模式的UML类图
eclipse结构图
主函数【应用(Application)】
Application.java
package angle_adapter;
/*
测试类Application : main函数
*/
import angle_adapter.Enemy;
import angle_adapter.HeroYuange;
import angle_adapter.KuileiOfYuange;
import angle_adapter.TargetHero;
import angle_adapter.Yuange;
public class Application {
public static void main(String[] args) {
TargetHero enemy; //目标接口(敌方被模仿英雄)
Enemy makeboluo=new Enemy(); //被模仿英雄:马可波罗
enemy=makeboluo; //原本属于被模仿英雄马可波罗的局内台词
System.out.println("标准的英雄及其所属台词:");
enemy.beenLearntFromAnEnemyHero(); //接通电流,开始洗衣服
System.out.println("-----------------------------------------------");
Yuange yuange=new Yuange(); //元歌想要模仿其他英雄及其局内台词
KuileiOfYuange kuilei=new KuileiOfYuange(yuange);//元歌不能直接模仿,需要借助适配器——傀儡
enemy=kuilei; //元歌的傀儡模仿敌方英雄马可波罗及其局内台词
System.out.println("被元歌傀儡伪装后的英雄及其所属台词:");
yuange.learnFromAnEnemyHero(); //元歌局内实现原本属于其他英雄的台词
}
}
class Enemy implements TargetHero{ //原本属于目标英雄“马可波罗”的局内台词
String name;
Enemy(){
name="马可波罗";
}
Enemy(String s){
name=s;
}
public void beenLearntFromAnEnemyHero(){
dialogue();
}
public void dialogue(){
System.out.println(name+":世界不只有眼前的苟且,还有诗和远方");
}
}
class Yuange implements HeroYuange{ //元歌在局内可以实现原本属于其他英雄的台词
String name;
Yuange(){
name="【元歌】马可波罗";
}
Yuange(String s){
name=s;
}
public void learnFromAnEnemyHero(){
simulateDialogue();
}
public void simulateDialogue(){
System.out.println(name+":世界不只有眼前的苟且,还有诗和远方");
}
}
目标(Target)
TargetHero.java
package angle_adapter;
/*
角色1:目标:是一个接口,该接口是客户想使用的接口
*/
public interface TargetHero {
public abstract void beenLearntFromAnEnemyHero();
}
被适配者(Adaptee)
HeroYuange.java
package angle_adapter;
/*
角色2:被适配者:是一个已存在的接口或抽象类,这个接口或抽象类需要适配
*/
public interface HeroYuange {
public abstract void learnFromAnEnemyHero();
}
适配器(Adapter)
KuileiOfYuange.java
package angle_adapter;
/*
角色3:适配器:是一个类,该类实现了目标接口并包含有被适配者的引用(适配器的职责是对被适配者接口(抽象类)与目标接口进行适配)
*/
import angle_adapter.HeroYuange;
public class KuileiOfYuange implements TargetHero{
HeroYuange yuangeKuilei;
KuileiOfYuange(HeroYuange yuangeKuilei){ //元歌傀儡作为适配器
this.yuangeKuilei=yuangeKuilei;
}
public void beenLearntFromAnEnemyHero(){
yuangeKuilei.learnFromAnEnemyHero();
}
}
运行结果截图
应用二(Iterator接口与Enumeration接口):
实现此适配器模式的UML类图
eclipse结构图
主函数【应用(Application)】
Application.java
package angle_adapterPattern;
import angle_adapterPattern.IOS;
import angle_adapterPattern.IteratorAdapter;
import angle_adapterPattern.AndroidOS;
import java.util.Enumeration;
public class Application {
public static void main(String[] args) {
AndroidOS androidRoleList=new AndroidOS();
androidRoleList.setRoleData();
Enumeration roleData=androidRoleList.getEnumeration();
IteratorAdapter adapter=new IteratorAdapter(roleData);
IOS newRoleData=new IOS(adapter);
newRoleData.setRoleData();
System.out.println("【系统提示】 恭喜您!您的角色数据在安卓、iOS系统互通成功了!");
System.out.println("------------------------------------------------------------");
System.out.println("【系统提示】 您在安卓系统的角色数据成功导入到iOS系统中的数据有:");
newRoleData.getRoleData();
}
}
1)AndroidOS类
AndroidOS.java
package angle_adapterPattern;
import java.util.Enumeration;
import java.util.Vector;
public class AndroidOS {
private Vector<String> vector;
private Enumeration roleData;
AndroidOS(){
vector=new Vector<String>();
}
public void setRoleData(){
vector.add(" 【金币】 1314");
vector.add(" 【钻石】 520");
vector.add(" 【点券】 521");
vector.add(" 【英雄】 98");
vector.add(" 【皮肤】 296");
vector.add(" 【段位】 荣耀王者101星");
vector.add(" ……");
}
public Enumeration getEnumeration(){
return vector.elements();
}
}
2)IOS类
IOS.java
package angle_adapterPattern;
import java.util.Iterator;
import java.util.LinkedList;
public class IOS {
LinkedList<String> roleData;
Iterator iterator;
IOS(Iterator iterator){
roleData=new LinkedList<String>();
this.iterator=iterator;
}
public void setRoleData(){
while(iterator.hasNext()){
String data=(String)iterator.next();
roleData.add(data);
}
}
public void getRoleData(){
Iterator<String> iter=roleData.iterator();
while(iter.hasNext()){
String data=iter.next();
System.out.println(data);
}
}
}
适配器(Adapter)
IteratorAdapter.java
package angle_adapterPattern;
import java.util.Enumeration;
import java.util.Iterator;
public class IteratorAdapter implements Iterator{
Enumeration heroData;
IteratorAdapter(Enumeration heroData){
this.heroData=heroData;
}
public boolean hasNext(){
return heroData.hasMoreElements();
}
public Object next(){
return heroData.nextElement();
}
public void remove(){
System.out.println("枚举器没有删除集合元素的方法");
}
}
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏
欢迎留言,一起交流学习
感谢阅读