·
外观模式在王者荣耀中的应用
·
一、简述
王者荣耀是由腾讯游戏天美工作室群开发并运行的一款运营在Android、IOS、NS平台上的MOBA类手机游戏。玩家在想要玩这款游戏时,直接点击王者荣耀APP图标启动即可,系统会自动调用并不需要玩家分别启动界面、音乐、更新安装包等。
无论在现实生活中还是在软件开发过程中,用户经常需要和多个对象打交道。如果不对这些对象通过一种方式组合,用户完成某项任务时就很不方便,于是我们可以通过"外观类"的角色来简化用户和多个对象之间的交互过程。
在本实例中,模拟玩家打开游戏的操作,玩家只需要点击APP的图标,系统就会自动调用一系列的功能模块进行游戏初始化。
二、外观模式(Facade Pattern)
外观模式理解:
高度概括:为系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
一个大的系统一般都由若干个子系统构成,每个子系统包含多个类,这些类协同合作为用户提供所需要的功能。一个客户程序中的某个类的实例如果直接和子系统的多个类的实例打交道完成多项任务,就使客户程序中的类和子系统类有过多的依赖关系。
外观模式是简化用户和子系统进行交互的成熟模式,外观模式的关键是为子系统提供一个称作外观的类,该外观类的实例负责和子系统中类的实例打交道,当用户想要和子系统中的若干个类的实例打交道时,可以代替地和子系统的外观类的实力打交道。
外观模式结构中的两种角色:
❶ 子系统(Subsystem):子系统是若干个类的集合,这些类的实例协同合作为用户提供所需要的功能,子系统中任何类都不包含外观类的实例引用;
❷ 外观(Facade):外观是一个类,该类包含子系统中全部或部分类的实例引用,当用户想要和子系统中的若干个类的实例打交道时,可以代替地和子系统的外观类的实例打交道。
外观模式的UML类图:
外观模式的优缺点:
优点:
①使客户和子系统中的类无耦合,并且子系统使用起来更加方便;
②外观只是提供了一个更加简洁的界面,并不影响用户直接使用子系统的类;
③子系统中任何类对其方法的内容进行修改,不影响外观类的代码。
缺点:
①不能很好的限制用户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性;
②在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了"开闭原则"。
外观模式的适用情景:
①对于一个复杂的子系统,需要为用户提供一个简单的交互操作;
②不希望客户代码和子系统中的类有耦合,以便提高子系统的独立性和可移植性;
③当整个系统需要构建一个层次结构的子系统,不希望这些子系统相互直接的交互。
三、王者荣耀角度下实现外观模式结构图及代码
实现此外观模式的UML类图
eclipse结构图
主函数【应用(Application)】
Application.java
package angle_chainOfResponsibility;
import angle_chainOfResponsibility.ClientServerFacade;
/*
应用测试类
*/
public class Application {
public static void main(String[] args) {
ClientServerFacade clientFacade,clientFacade1,clientFacade2,clientFacade3,clientFacade4,clientFacade5,clientFacade6;
String clientPoint="腾讯游戏(Tencent Games)图标加载中……";
clientFacade=new ClientServerFacade(clientPoint);
clientFacade.doPoint4();
System.out.println("-----------------------------------------");
String clientPoint1="天美工作室群(TIMI-L1 STUDIO)图标加载中……";
clientFacade1=new ClientServerFacade(clientPoint1);
clientFacade1.doPoint5();
System.out.println("-----------------------------------------");
String clientPoint2="正在为您检查版本更新……";
clientFacade2=new ClientServerFacade(clientPoint2);
clientFacade2.doPoint();
System.out.println("------------------------------------------");
String clientPoint3="正在为您初始化资源包……";
clientFacade3=new ClientServerFacade(clientPoint3);
clientFacade3.doPoint3();
System.out.println("------------------------------------------");
String clientPoint4="正在为您加载游戏……";
clientFacade4=new ClientServerFacade(clientPoint4);
clientFacade4.doPoint2();
System.out.println("------------------------------------------");
String clientPoint6="玩家点击“开始游戏”即可进入游戏……";
clientFacade6=new ClientServerFacade(clientPoint6);
clientFacade6.doPoint6();
System.out.println("------------------------------------------------------------");
String clientPoint5="当玩家想要退出游戏时……";
clientFacade5=new ClientServerFacade(clientPoint5);
clientFacade5.doPoint1();
}
}
子系统(Subsystem)
TencentGames.java
package angle_chainOfResponsibility;
/*
1.腾讯游戏图标加载
*/
public class TencentGames {
String points;
public TencentGames(String points){
this.points=points;
}
public void tencentGames(){
System.out.println(points);
System.out.println("腾讯游戏(Tencent Games)图标加载完毕");
}
}
TiMi_L1Studio.java
package angle_chainOfResponsibility;
/*
2.天美工作室群图标加载
*/
public class TiMi_L1Studio {
String points;
public TiMi_L1Studio(String points){
this.points=points;
}
public void timi_L1Studio(){
System.out.println(points);
System.out.println("天美工作室群(TIMI-L1 STUDIO)图标加载完毕");
}
}
CheckUpdate.java
package angle_chainOfResponsibility;
/*
3.正在为您检查版本更新
*/
public class CheckUpdate {
String points;
public CheckUpdate(String points){
this.points=points;
}
public void checkUpdate(){
System.out.println(points);
System.out.println("版本更新检查完毕,您的版本已是最新版本");
}
}
InitializeResourcePack.java
package angle_chainOfResponsibility;
/*
4.正在为您初始化资源包
*/
public class InitializeResourcePack {
String points;
public InitializeResourcePack(String points){
this.points=points;
}
public void initializeResourcePack(){
System.out.println(points);
System.out.println("资源包初始化完毕");
}
}
HaveAGoodGame.java
package angle_chainOfResponsibility;
/*
5.加载完毕,祝您游戏愉快
*/
public class HaveAGoodGame {
String points;
public HaveAGoodGame(String points){
this.points=points;
}
public void haveAGoodGame(){
System.out.println(points);
System.out.println("加载完毕,祝您游戏愉快。");
}
}
StartGames.java
package angle_chainOfResponsibility;
/*
6.开始游戏
*/
public class StartGames {
String points;
public StartGames(String points){
this.points=points;
}
public void startGames(){
System.out.println(points);
System.out.println(" *****************************************************");
System.out.println("* 王者荣耀 xxxxxx[注销] *");
System.out.println("* [?] *");
System.out.println("* [单机] *");
System.out.println("* [中/ENG] *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* *");
System.out.println("* [爆满] 手Q273区 制裁神谕 换区→ *");
System.out.println("* 【开始游戏】 *");
System.out.println("* *");
System.out.println(" *****************************************************");
}
}
ExitGame.java
package angle_chainOfResponsibility;
/*
7.退出游戏
*/
public class ExitGame {
String points;
public ExitGame(String points){
this.points=points;
}
public void exitGame(){
System.out.println(points);
System.out.println(" *******************************");
System.out.println("* 提示 *");
System.out.println("* *");
System.out.println("* 是否退出游戏 ? *");
System.out.println("* *");
System.out.println("* 【取消】 【确定】 *");
System.out.println(" ********************************");
}
}
外观(Facade)
ClientServerFacade.java
package angle_chainOfResponsibility;
/*
外观类
*/
import angle_chainOfResponsibility.CheckUpdate;
import angle_chainOfResponsibility.ExitGame;
import angle_chainOfResponsibility.HaveAGoodGame;
import angle_chainOfResponsibility.InitializeResourcePack;
import angle_chainOfResponsibility.TencentGames;
import angle_chainOfResponsibility.TiMi_L1Studio;
import angle_chainOfResponsibility.StartGames;
public class ClientServerFacade{
private CheckUpdate checkUpdate;
private ExitGame exitGame;
private HaveAGoodGame haveAGoodGame;
private InitializeResourcePack initializeResourcePack;
private TencentGames tencentGames;
private TiMi_L1Studio timi_L1Studio;
private StartGames startGames;
String point,point1,point2,point3,point4,point5,point6;
public ClientServerFacade(String point){
this.point=point;
checkUpdate=new CheckUpdate(point);
this.point=point;
haveAGoodGame=new HaveAGoodGame(point);
this.point=point;
exitGame=new ExitGame(point);
this.point=point;
initializeResourcePack=new InitializeResourcePack(point);
this.point=point;
tencentGames=new TencentGames(point);
this.point=point;
timi_L1Studio=new TiMi_L1Studio(point);
this.point=point;
startGames=new StartGames(point);
}
public void doPoint(){
checkUpdate.checkUpdate();
}
public void doPoint1(){
exitGame.exitGame();
}
public void doPoint2(){
haveAGoodGame.haveAGoodGame();
}
public void doPoint3(){
initializeResourcePack.initializeResourcePack();
}
public void doPoint4(){
tencentGames.tencentGames();
}
public void doPoint5(){
timi_L1Studio.timi_L1Studio();
}
public void doPoint6(){
startGames.startGames();
}
}
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→主页
欢迎留言,一起交流学习
感谢阅读