从王者荣耀看设计模式(十.外观模式)

摘要:
从王者荣耀看设计模式一.简介王者荣耀是由多人协同开发而成,每个人负责游戏的一个或多个子功能,一个完整的功能是由很多已开发的子功能组合成的。)二.外观模式外观模式外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这一接口使得这一子系统更加容易使用。

从王者荣耀看设计模式(外观模式)

从王者荣耀看设计模式(十.外观模式)第1张

一.简介

王者荣耀是由多人协同开发而成,每个人负责游戏的一个或多个子功能,一个完整的功能是由很多已开发的子功能组合成的。我们要玩游戏时,只需要打开王者荣耀APP,无需知道具体有哪些功能被调用,系统会自动来完成游戏初始化过程(检查版本更新、校验安装包,加载登陆动图,加载背景音乐……)

二.外观模式

外观模式(Facade Pattern)外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这一接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式

模式动机
无论在现实生活中还是在软件开发过程中,人们经常需要和多个对象打交道。我们可以通过"外观类"的角色来简化用户和多个对象之间的交互过程。在本实例中,模拟用户打开游戏的操作,用户只需要点击APP的图标,系统调用一系列的功能模块进行初始化

  • 外观模式的使用场景

    1. 当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统
    2. 客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
    3. 在层次化结构中,可以使用外观模式定义系统中每层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度
  • 外观模式涉及的设计原则有:

  1. 为了交互对象之间的松耦合设计而努力
  2. 封装一个外观类,调用多个子系统中的相关方法组合成一个所需的完整的功能
  • 外观模式的通用类图:
    从王者荣耀看设计模式(十.外观模式)第2张

  • 外观模式所涉及的角色有:
    Facade(外观角色):在客户端可以调用这个角色的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,他将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
    SubSystem(子系统角色):在软件系统中可以同时有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每个子系统都可以被客户端直接调用,或者被外观角色调用,它处理从外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观仅仅是另一个客户端而已。

  • 外观模式的优点:
    外观模式并不给系统增加任何新的功能,它仅仅是增加一些简单化的接口。

  1. 对客户屏蔽子系统的组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引用外观模式,客户代码将变得很简单,与之关联的对象也很少。
  2. 实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
  3. 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有的其他子系统。一个子系统的修改对其他的子系统没有任何影响,而且子系统内部变化也不会影响到外观对象
  4. 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
  • 外观模式的缺点:
  1. 不能很好的限制用户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
  2. 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了"开闭原则"

三.结构图

从王者荣耀看设计模式(十.外观模式)第3张

四.设计类图

从王者荣耀看设计模式(十.外观模式)第4张

五.代码实现

GameFacade类(外观类)

package com.practice.Facade;

import com.practice.SubSystem.CheckUpdate;
import com.practice.SubSystem.GameProcess;
import com.practice.SubSystem.InitializeResource;
import com.practice.SubSystem.LoadMusic;
import com.practice.SubSystem.OverloadGif;
import com.practice.SubSystem.VerifyPackage;

/*
 * 外观角色类
 */

public class GameFacade {
	CheckUpdate cu;
	VerifyPackage vp;
	InitializeResource ir;
	OverloadGif og;
	LoadMusic lm;
	GameProcess gp;
	
	public GameFacade(CheckUpdate cu,VerifyPackage vp,InitializeResource ir,OverloadGif og,LoadMusic lm,GameProcess gp) {
		this.cu = cu;
		this.vp = vp;
		this.ir = ir;
		this.og = og;
		this.lm = lm;
		this.gp = gp;
	}
	
	//打开游戏,调用各子系统方法
	public void GameOpen(String game) throws InterruptedException {
		System.out.println("Get ready to play a game!");
		cu.CheckOn();
		vp.VerifyOn();
		ir.Initial();
		og.OverloadGifOn();
		lm.LoadingMusic();
		gp.gameStart();
	}
	
	//游戏结束
	public void GameClose() throws InterruptedException{
		gp.GameOver();
	}
}

CheckUpdate类(检查版本更新子系统)

package com.practice.SubSystem;
/*
 * 检查版本更新子系统
 */

public class CheckUpdate {
	public void CheckOn() throws InterruptedException {
		System.out.println("正在为您检测版本更新……");
		Thread.sleep(2000);
		CheckOff();
	}
	
	public void CheckOff() {
		System.out.println("检测为最新版本");
	}
}

GameProcess类(游戏进程子系统)

package com.practice.SubSystem;

/*
 * 游戏进程子系统(开始/结束)
 */

public class GameProcess {
	public void gameStart() throws InterruptedException {
		System.out.println("游戏开始!");
		for(int i=10;i>0;i--) {
			System.out.println("游戏中--"+i);
			Thread.sleep(1000);
		}
	}
	
	public void GameOver() {
		System.out.println("游戏结束");
	}
}

*** InitializeResource类(初始化资源子系统)***

package com.practice.SubSystem;

/*
 * 初始化资源管理子系统
 */

public class InitializeResource {
	public void Initial() throws InterruptedException{
		System.out.println("正在初始化资源管理……");
		Thread.sleep(2000);
		InitialOff();
	}
	
	public void InitialOff() {
		System.out.println("初始化完成!");
	}
}

LoadMusic类(加载背景音乐子系统)

package com.practice.SubSystem;
/*
 * 加载音乐子系统
 */
public class LoadMusic {
	public void LoadingMusic() throws InterruptedException{
		System.out.println("正在加载背景音乐……");
		Thread.sleep(1000);
		LoadingMusicOver();
	}
	
	public void LoadingMusicOver() {
		System.out.println("背景音乐加载完成");
	}
}

OverloadGif类(加载登陆动图类)

package com.practice.SubSystem;
/*
 * 加载动画子系统
 */
public class OverloadGif {
	public void OverloadGifOn() throws InterruptedException{
		System.out.println("正在加载界面动画……");
		Thread.sleep(1000);
		OverloadGifOff();
	}
	
	public void OverloadGifOff() {
		System.out.println("界面动画加载完成!");
	}
}

VerifyPackage类(校验安装包类)

package com.practice.SubSystem;
/*
 * 校验安装包子系统
 */

public class VerifyPackage {
	public void VerifyOn() throws InterruptedException {
		System.out.println("正在为您校验安装包……");
		Thread.sleep(1000);
		VerifyOff();
	}
	
	public void VerifyOff() {
		System.out.println("校验完成!");
	}
}

FacadeTest类(测试类)

package com.practice.Client;

import com.practice.Facade.GameFacade;
import com.practice.SubSystem.CheckUpdate;
import com.practice.SubSystem.GameProcess;
import com.practice.SubSystem.InitializeResource;
import com.practice.SubSystem.LoadMusic;
import com.practice.SubSystem.OverloadGif;
import com.practice.SubSystem.VerifyPackage;

/*
 * 测试类
 */

public class FacadeTest {
	public static void main(String [] args) throws InterruptedException {
		//初始化组件
		CheckUpdate cu = new CheckUpdate();
		VerifyPackage vp = new VerifyPackage();
		InitializeResource ir = new InitializeResource();
		OverloadGif lg = new OverloadGif();
		LoadMusic lm = new LoadMusic();
		GameProcess gp = new GameProcess();
		
		GameFacade gf = new GameFacade(cu,vp,ir,lg,lm,gp);
		gf.GameOpen("Glory to the king");//打开游戏
		gf.GameClose();//关闭游戏
	}
}

六.运行结果

从王者荣耀看设计模式(十.外观模式)第5张

七.源代码下载

从王者荣耀看设计模式(外观模式);

免责声明:文章转载自《从王者荣耀看设计模式(十.外观模式)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在静态方法中获取properties /yml 配置文件中的信息VS常用技巧下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#设计模式总结(转)

一、引言   经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构。所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式。这里对设计模式做一个总结,一来可以对所有设计模式进行一个梳理,二来可以做一个索引来帮助大家收藏。   PS: 其实,很早之前我就看过所有的设计模式了,但是...

设计模式之外观模式(门面模式)以及如何利用到接口设计中

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。  外观模式应用场景 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。...

设计模式(9)---外观模式

外观模式 Facade (结构型模式) 1.概述 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。 例如:你请朋友吃饭,你可能需要买菜,洗菜,切菜,做菜等等这些模块,现在你去...

外观模式小试

一、介绍: 引用《研磨设计模式》中的定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这一接口使得这一子系统更易于使用。 外观模式的本质是——封装交互、简化调用。 什么意思呢?外观模式封装交互的目的,就是简化调用。说白了,就是要讲各个模块之间复杂的交互,放到外观类的某些方法中。然后在外观类中选择性的将某些方法暴露给外部去调用...

设计模式(9)外观模式

我们每天上班回到家的时候都会做一系列的动作,像打开灯、打开电视和打开音响,用代码描述就如下一样。 public class Light { public void on() { System.out.println("打开了灯!"); } public void off() { System.ou...