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

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

作者头像
荣仔_最靓的仔
发布于 2021-02-02 09:31:52
发布于 2021-02-02 09:31:52
55400
代码可运行
举报
运行总次数:0
代码可运行

·

桥接模式在王者荣耀中的应用

·

一、简述

王者荣耀中有一个观战系统。在观战系统中,玩家可以观看大神如何在战场上操作,从而学习大神出装、团战技巧等,同时也可以看好友如何战斗,以及回放自己的经典之战。观战系统的存在,可以让玩家们近距离观看大神或好友如何操作,针对练习更便捷。本地回放功能,完美保留精彩瞬间,战后回味别有一番趣味。

二、桥接模式(Bridge Pattern)

桥接模式理解: 高度概括:将抽象部分与它的实现部分分离,使他们都可以独立的变化. 抽象类或接口中可以定义若干个抽象方法,习惯上将抽象方法称作操作。抽象类或接口使程序的设计者忽略操作的细节,即不必考虑这些操作是如何实现的,当用户程序面向抽象类或接口时,就不会依赖具体的实现,使系统有很好的扩展性。但是,抽象类中的抽象方法总归是需要子类去实现的,在大多数情况下,抽象类的子类完全可以胜任这样的工作,但是,在某些情况下之,子类可能会遇到一些难以处理的问题,比如,不能因为有一个玩家想要观战不同的比赛,就要出现一个专门为该玩家制作比赛回放的子类。针对上述问题,我们称在Battle类和WatchWar类之间的关系是桥接关系,也就是说,Battle类的子类仅仅在Battle和WatchWar之间起到一个“桥接”的作用。 桥接模式是关于怎样将抽象部分与它的实现部分分离,使他们都可以独立的变化的成熟模式。

桥接模式结构中的四种角色:抽象(Abstraction):是一个抽象类,该类含有Implementor声明的变量,即维护一个Implementor类型对象; ②实现者(Implementor):实现者决策是一个接口(抽象类),该接口(抽象类)中的方法不一定与类中的方法一致。Implementor接口(抽象类)负责定义基本操作 而Abstraction类负责定义基于这些基本操作的较高层次的操作; ③细化抽象(Refined Abstraction):细化抽象是抽象角色的一个子类,该子类在重写(覆盖)抽象角色中的抽象方法时,在给出一些必要操作后,将委托所维护Implemento类型对象调用相应的方法; ④具体实现者(Concrete Impletementor):具体实现者是实现(扩展)Implementor接口(抽象类)的类。

桥接模式的UML类图:

桥接模式的优缺点: 优点: ①分离抽象接口及其实现部分,使得抽象和实现可以沿着各自的维度来变化; ②桥接模式有时类似于多继承方案。但是多继承方案违背了类的单一职责原则,复用性比较差,而且多继承结构中累的个数非常庞大,桥接模式是比多继承方案更好的解决办法; ③桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原系统; ④实现细节对客户透明,可以对用户隐藏实现细节; ⑤满足开-闭原则,抽象和实现者处于同层次,使系统可独立地扩展这两个层次。增加新的具体现者,不需要修改细化抽象,反之增加新的细化抽象也不需要修改具体实现; 缺点: ①桥接模式的引入会增加系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程; ②桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

桥接模式的适用情景: ①不想让抽象和某些重要的实现代码是固定的绑定关系,这部分实现可运行时动态决定; ②抽象和实现者都可以以继承的方式独立地扩充而互不影响,程序在运行期间可能需要动态的将一个抽象的子类的实例与一个实现者的子类的实例进行组合; ③希望对实现者层次代码的修改对抽象层不产生影响,即抽象层的代码不必重新编译,反之亦然。

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

此模式实例下的UML类图

eclipse结构图

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package angle_bridgePattern;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Application extends JFrame{
      JButton seeWar;
      WatchWar watchWar;
      Battle battle;
      Application(WatchWar war,Battle battle){
    	   watchWar=war;
           this.battle=battle; 
           add(watchWar,BorderLayout.CENTER);
           seeWar=new JButton("观战");  
           add(seeWar,BorderLayout.SOUTH);
           seeWar.addActionListener(new ActionListener(){
                                            public void actionPerformed(ActionEvent e){
                                            	watchWar.makeWarContants();
                                            }});
          setVisible(true);
          setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      }
      public static void main(String args[]) {
           Battle  battle=new FriendsBattle();
           WatchWar  war=new FriendsWatchingWar(battle);
           Application  application1=new Application(war,battle);
           application1.setBounds(10,10,200,300);  
           battle=new GreatGodBattle();
           war=new GreatGodWatchingWar(battle);
           Application  application2=new Application(war,battle);
           application2.setBounds(220,10,200,300); 
      }
}   

抽象 WatchWar.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package angle_bridgePattern;

import javax.swing.*;
import java.awt.*;

public abstract class  WatchWar extends JPanel{
      Battle  battleMaker;
      public  abstract void makeWarContants () ;
}

实现者 Battle.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package angle_bridgePattern;

import java.util.ArrayList;
public interface Battle{
     public  ArrayList<String>  makeBattle();
}

细化抽象 FriendsWatchingWar.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package angle_bridgePattern;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;

public  class  FriendsWatchingWar extends WatchWar implements Runnable{
     JLabel showWar;
     Thread thread;
     ArrayList<String> content;
     FriendsWatchingWar(Battle battle){
    	   battleMaker=battle;  
           setLayout(new BorderLayout());
           showWar=new JLabel("好友观战");
           showWar.setFont(new Font("",Font.BOLD,39));
           add(showWar,BorderLayout.CENTER);
           thread=new Thread(this);
    } 
     public void makeWarContants (){
           content=battleMaker.makeBattle();
           if(!thread.isAlive()){
                thread=new Thread(this);
                thread.start();  
           }
     }
     public void run(){
           for(int i=0;i<content.size();i++){
        	    showWar.setText(content.get(i)); 
                try{  Thread.sleep(1500);
                }
                catch(InterruptedException exp){}
           }
     }
}

GreatGodWatchingWar.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package angle_bridgePattern;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;

public  class  GreatGodWatchingWar extends WatchWar implements Runnable{
     JLabel showWar;
     Thread thread;
     ArrayList<String> content;
     GreatGodWatchingWar(Battle battle){
    	   battleMaker=battle;  
           setLayout(new BorderLayout());
           showWar=new JLabel("大神观战");
           showWar.setFont(new Font("",Font.BOLD,39));
           add(showWar,BorderLayout.CENTER);
           thread=new Thread(this);
    } 
     public void makeWarContants (){
           content=battleMaker.makeBattle();
           if(!thread.isAlive()){
                thread=new Thread(this);
                thread.start();  
           }
     }
     public void run(){
           for(int i=0;i<content.size();i++){
        	    showWar.setText(content.get(i)); 
                try{  Thread.sleep(1500);
                }
                catch(InterruptedException exp){}
           }
     }
}

具体实现者 FriendsBattle.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package angle_bridgePattern;

import angle_bridgePattern.Battle;

import java.util.ArrayList;
public class FriendsBattle implements Battle{
      ArrayList<String> content;
      FriendsBattle(){
          content=new ArrayList<String>();
     }
      public  ArrayList<String>  makeBattle(){
              content.clear();
              content.add("好友【峡谷一级演员】选择嬴政出战");
              content.add("好友【峡谷一级演员】使用嬴政击杀敌方英雄获得一血");
              content.add("好友【峡谷一级演员】使用嬴政“无人能挡”");
              content.add("好友【峡谷一级演员】向队友发出“集合,保护我方水晶”信号");
              content.add("晋级对局结束!好友【峡谷一级演员】晋级失败!");
              return content;
      }
}

GreatGodBattle.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package angle_bridgePattern;

import angle_bridgePattern.Battle;

import java.util.ArrayList;
public class GreatGodBattle implements Battle{
      ArrayList<String> content;
      GreatGodBattle(){
          content=new ArrayList<String>();
     }
      public  ArrayList<String>  makeBattle(){
              content.clear();
              content.add("大神玩家【小心边路反杀】选择橘右京出战");
              content.add("大神玩家【小心边路反杀】使用橘右京击杀敌方英雄获得一血");
              content.add("大神玩家【小心边路反杀】使用橘右京“大杀特杀”");
              content.add("大神玩家【小心边路反杀】向队友发出“集合,攻击敌方水晶”信号");
              content.add("对局结束!大神玩家获得胜利!");
              return content;
      }
}

运行结果截图

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

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

感谢阅读

END

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
ACE Tools使用指南
ACE Tools是一套为ArkUI-X应用开发者提供的命令行工具,支持在Windows/Ubuntu/macOS平台运行,用于构建OpenHarmony、HarmonyOS、Android和iOS平台的应用程序, 其功能包括开发环境检查,新建项目,编译打包,安装调试等。
徐建国
2023/12/28
9210
ACE Tools使用指南
ArkUI-X跨平台已至,何需其它!
我们之前可能更多接触的是ArkUI,我们都知道ArkUI是一套构建分布式应用的声明式UI开发框架。如今ArkUI-X进一步将ArkUI扩展到了多个OS平台:目前支持OpenHarmony、HarmonyOS、Android、 iOS,四个平台。未来也会支持更多的平台。
徐建国
2023/12/28
7870
ArkUI-X跨平台已至,何需其它!
ArkUI-X应用工程结构说明
本文档配套ArkUI-X,将OpenHarmony ArkUI开发框架扩展到不同的OS平台,比如Android和iOS平台,让开发者基于ArkUI,可复用大部分的应用代码(UI以及主要应用逻辑)并可以部署到相应的OS平台,降低跨平台应用开发成本。
龙儿筝
2025/06/19
650
ArkUI-X跨平台框架接入指南
ArkUI跨平台框架(ArkUI-X)进一步将ArkUI开发框架扩展到了多个OS平台:目前支持OpenHarmony、Android、 iOS,后续会逐步增加更多平台支持。开发者基于一套主代码,就可以构建支持多平台的精美、高性能应用。
龙儿筝
2025/05/18
1610
ArkUI-X跨平台框架接入指南
ArkUI-X跨平台已至,何需其它!
我们之前可能更多接触的是ArkUI,我们都知道ArkUI是一套构建分布式应用的声明式UI开发框架。如今ArkUI-X进一步将ArkUI扩展到了多个OS平台:目前支持OpenHarmony、HarmonyOS、Android、 iOS,四个平台。未来也会支持更多的平台。
小帅聊鸿蒙
2024/07/05
4030
ArkUI-X跨平台已至,何需其它!
ArkUI-X添加到现有Android项目中
本教程主要讲述如何利用ArkUI-X SDK完成Android AAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:
龙儿筝
2025/05/28
940
ArkUI-X添加到现有Android项目中
ArkUI-X构建Android平台AAR及使用
本教程主要讲述如何利用ArkUI-X SDK完成Android AAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:
龙儿筝
2025/06/12
640
鸿蒙跨平台 ArkUI-X从入门到入土
喊了好长时间要做鸿蒙应用,自己也写了一点,但要同时照顾三个移动平台有点恶心,大致看了一下鸿蒙社区的 arkui-x 跨平台方案 https://gitee.com/arkui-x[1] ,先调研一下试试水
徐建国
2024/01/31
2.4K0
鸿蒙跨平台 ArkUI-X从入门到入土
跨Android、iOS、鸿蒙多平台框架ArkUI-X
ArkUI是一套构建分布式应用界面的声明式UI开发框架。它使用极简的UI信息语法、丰富的UI组件、以及实时界面预览工具,帮助您提升移动应用界面开发效率30%。您只需使用一套ArkTS API,就能在Android、iOS、鸿蒙多个平台上提供生动而流畅的用户界面体验。
小帅聊鸿蒙
2024/07/08
4240
跨Android、iOS、鸿蒙多平台框架ArkUI-X
ArkUI-X 5.0.5 Release (API7)发布:安卓适配全面升级,跨平台能力再突破
本文聚焦 ArkUI-X 5.0.5 Release 版本更新,重点介绍其在安卓平台适配、跨平台框架能力、开发工具易用性及组件与 API 扩展等方面的核心升级内容,同时提供版本与平台配套关系及实践指引,帮助开发者快速掌握新版本特性。
徐建国
2025/05/21
1240
ArkUI-X 5.0.5 Release (API7)发布:安卓适配全面升级,跨平台能力再突破
ArkUI-X跨平台技术落地-华为运动健康(一)
目前,华为运动健康App在Android 和 iOS均有独立的客户端工程,在原生页面部分,两个客户端独立开发,代码各自维护和演进,会带来各自独立的开发工作量,并且两个端之间的交互体验也无法做到一致。
龙儿筝
2025/06/18
500
ArkUI-x跨平台Bridge最佳实践
平台桥接机制是ArkUI-X框架提供的⼀种ArkTs语⾔和平台原⽣语⾔(Java、OC)之间通信的机制,⽅便⼆者互相调⽤。需要说明的是,平台桥接机制必须在打开ArkUI界⾯时才能进⾏,不能在⾮ArkUI界⾯触发。平台桥接机制有两种应⽤场景:
龙儿筝
2025/06/10
410
跨平台开发鸿蒙原生应用
uni-app 是一个使用 Vue.js[1] 开发所有前端应用的框架,开发者编写一套代码,可发布到 HarmonyOS、iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。
徐建国
2024/11/12
3230
跨平台开发鸿蒙原生应用
ACE Tools环境配置指导【macOS】
ACE Tools是一套为ArkUI-X应用开发者提供的命令行工具,支持在Windows/Ubuntu/macOS平台运行,用于构建OpenHarmony、HarmonyOS、Android和iOS平台的应用程序, 其功能包括开发环境检查,新建项目,编译打包,安装调试等,以下是详细的环境配置指导。
徐建国
2023/12/28
4330
ACE Tools环境配置指导【macOS】
【HarmonyOS 5】鸿蒙跨平台开发方案详解(二)
作为最早实现鸿蒙适配的跨平台框架,Flutter在社区推动下已形成较完整的技术方案。当前鸿蒙版Flutter已发布3.22.0-ohos版本,该版本基于Flutter 3.22.0核心。
GeorgeGcs
2025/06/25
450
【HarmonyOS 5】鸿蒙跨平台开发方案详解(二)
ArkUI-X 5.0.4 Release:跨平台开发的全新体验
随着 ArkUI-X 5.0.4 Release 版本的发布,开发者们迎来了一个更加强大、灵活且高效的跨平台开发框架。ArkUI-X 作为鸿蒙生态中的重要一员,不仅在功能上不断丰富和完善,还通过持续优化开发体验,吸引了越来越多的开发者加入鸿蒙开发的行列。本文将详细介绍 ArkUI-X 5.0.4 Release 的新特性和优化内容,以及它在跨平台开发中的优势。
徐建国
2025/04/18
2540
ArkUI-X 5.0.4 Release:跨平台开发的全新体验
技术创作特训营第一期|ArkUI—X跨平台应用视频播放器
ArkUI是一套构建分布式应用的声明式UI开发框架。它具备简洁自然的UI信息语法、丰富的UI组件、多维的状态管理,以及实时界面预览等相关能力,帮助您提升应用开发效率,并能在多种设备上实现生动而流畅的用户体验。
徐建国
2023/08/09
7240
鸿蒙ArkUI-X简介
ArkUI是一套构建分布式应用的声明式UI开发框架。它具备简洁自然的UI信息语法、丰富的UI组件、多维的状态管理,以及实时界面预览等相关能力,帮助您提升应用开发效率,并能在多种设备上实现生动而流畅的用户体验。
龙儿筝
2024/11/28
2110
ArkUI-X与Android联动编译开发指南
本文主要介绍通过CLI工具链执行ace create project命令创建工程,生成联动编译脚本。使用Android Studio编译Android应用时,可联动编译ArkTS源码,并自动拷贝ArkTS产物到Android工程中。
龙儿筝
2025/06/16
700
ArkUI-X跨平台应用改造指南
随着 HarmonyOS Next 5.0 版本正式发布,众多开发者基于 ArkTS 语言为 HarmonyOS Next 系统开发了大量应用,这极大地丰富了 HarmonyOS 的生态。越来越多的应用上线,也给开发者带来了挑战,开发者需要同时开发和维护适用于 HarmonyOS Next、Android、iOS 三个平台的应用程序。这不仅意味着开发工作量大幅增加,开发成本也随之上升,而且很难保持一致的交互体验。
龙儿筝
2025/06/16
1080
推荐阅读
相关推荐
ACE Tools使用指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档