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

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

原创
作者头像
荣仔_最靓的仔
修改于 2021-02-01 03:04:08
修改于 2021-02-01 03:04:08
64400
代码可运行
举报
运行总次数: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); 
      }
}   

12345678910111213141516171819202122232425262728293031323334

抽象 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 () ;
}

12345678910

实现者 Battle.java

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

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

细化抽象 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){}
           }
     }
}
12345678910111213141516171819202122232425262728293031323334

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){}
           }
     }
}
12345678910111213141516171819202122232425262728293031323334

具体实现者 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;
      }
}
1234567891011121314151617181920

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;
      }
}

123456789101112131415161718192021

运行结果截图

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

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

感谢阅读

END

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之命令模式
王者荣耀是一款5v5的团队竞技游戏,良好的团队信息交流可以让玩家更好地领略英雄竞技的酣畅淋漓!为了保证局内交流的有效性和快捷性,天美团队在制作游戏时,在小地图下边设置了三个“开始撤退”、“发起进攻”、“请求集合”按钮(如上图箭头所指)。
荣仔_最靓的仔
2021/02/02
5330
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之命令模式
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之访问者模式
在王者荣耀的社交系统中有2大核心,一为好友系统二为战队系统,好友系统偏向于个人,战队系统偏向于一个集体。玩家可以自己筹备创建战队、亦可加入其他战队。战队系统让玩家能够寻找到可以一起游戏的小伙伴,让玩家既能玩的嗨起又能领取到丰厚的战队奖励,享受到游戏的真正乐趣!
荣仔_最靓的仔
2021/01/30
5890
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之迭代器模式
王者荣耀是一款允许多人组队的竞技游戏,在这种MOBA类游戏团队配合是最重要的,普遍玩家在排位中很多时候开黑上分相对比较容易,要比玩家单排上分强很多,于是许多玩家在王者荣耀大厅界面中,想要邀请好友一起玩游戏,这时玩家可以通过游戏列表查看QQ/微信好友的状态,以便判断是否邀请好友加入游戏。当好友在对局中时,玩家可以通过预约方式下把游戏一起玩;好友离线时,玩家则可以通过QQ/微信邀请好友上线,一起开黑。 以上就是迭代器模式在王者荣耀中的应用实例。本例中假设在线玩家和离线玩家信息分别以不同形式存储,或者假设在线玩家在列表中呈现给玩家的展示排序以及玩家显示信息分别以不同数据结构处理;当玩家想要依次查看各个好友的状态时,不需要了解上述等这些内容在系统内部的存在形式以及它们之间的关系就可以得知想要了解好友的状态等信息。
荣仔_最靓的仔
2021/01/30
6080
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式
登录游戏前,玩家面临选择以QQ账号登录还是微信账号登录的问题,进一步来说,玩家还面临着去哪一个区玩的问题;玩家开始游戏前,面临着配合阵容选英雄及其召唤师技能的问题;进入游戏后,玩家会面临根据战况选择使用一二三技能还是普攻,以及是否使用召唤师技能等问题。 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。 在上述3个实例中:
荣仔_最靓的仔
2021/01/30
3380
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之模板方法模式
在王者荣耀中,有查看所有英雄功能,并且玩家在查看英雄时可以对英雄的排序做调整。具体而言,玩家可以按照默认排序、名称排序、熟练度排序、上架时间排序、荣耀战力排序等排序方式使英雄按照不同位置排列。
荣仔_最靓的仔
2021/01/30
4150
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之适配器模式
简单来讲,适配器模式就是通过一个适配器将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
荣仔_最靓的仔
2021/01/30
3580
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之抽象工厂模式
王者荣耀QQ端目前有325个区供玩家选择,玩家们可以使用一个QQ号在不同区中登录,而且每个区中的数据由玩家在此区中体验次数、时间的变化而变化。
荣仔_最靓的仔
2021/02/02
3860
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之抽象工厂模式
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之生成器模式
在王者荣耀这款游戏中,玩家可以根据自己的喜好来调整页面布局,比如有的玩家觉得左侧出装顺手,而有的玩家则觉得右侧出装顺手;再比如说玩家在局内想要通过展开地图向队友发送信号时,有些玩家觉得地图左侧展开操作顺畅,而另外一些玩家觉得右侧展开操作顺畅。这些组件的页面布局亦可通过自定义来完成。所有的这些功能,达到了王者荣耀设计者让玩家能更好地体验游戏的初衷。 在本实例中,包含有地图左侧展开右侧出装、地图右侧展开左侧出装、地图/出装同左/右侧等多种组件,玩家对于不同组件的组合(布局)有着不同的要求。很显然,在编写代码时无法在构造方法中进行硬编码来满足所有玩家对组件组合(布局)的要求,而是将布局结果对象的构造过程分成若干个步骤,即根据当前组件个数,在一个接口中定义若干个方法,每个方法负责创建布局结果对象的一个组件,而实现该接口的类将负责创建布局结果对象,也就是说,将布局结果对象的创建过程封装在另一个类中(像这种封装一个对象的创建过程的类称作生成器),从而实现满足所有玩家对于出装、地图展开不同布局需求的目的。
荣仔_最靓的仔
2021/01/30
6590
23种设计模式之桥接模式
桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。
Java技术债务
2022/09/26
2300
23种设计模式之桥接模式
设计模式之桥接模式
Jungle有两个手机,分别是M手机和N手机,M手机上有游戏Game1,N手机上有Game2。每次Jungle想玩Game1时,就使用M手机,想玩Game2时,就玩N手机。要是某天Jungle外出,心情大好,两个游戏都想玩,那Jungle还得带上两个手机???麻不麻烦?
用户6557940
2022/07/24
3100
设计模式之桥接模式
Java面向对象设计之桥接模式
设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:
Abalone
2022/07/14
7211
Java面向对象设计之桥接模式
GoF 23种经典的设计模式——桥接模式
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
Andromeda
2024/01/17
1200
GoF 23种经典的设计模式——桥接模式
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之代理模式
应用一: 在王者荣耀这款游戏里,设置有很多种娱乐游戏模式,比如:无限乱斗、梦境大乱斗、火焰山大战等。当从王者荣耀的主界面点击万象天工进入各类模式的界面时,由于网络原因,会存在一定程度的延时(即会有一个圈圈在主界面一直转啊转啊转),直到加载完才会跳转到各模式界面。
荣仔_最靓的仔
2021/01/30
6840
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之组合模式
王者荣耀有非常多的英雄,而且每一个不同的英雄也有其自己对应的皮肤。玩家可以根据需要购买不同的英雄皮肤,体验不同英雄皮肤在对局中的感受。 在本实例中,根据组合模式的特点,列举了英雄李白及其皮肤的树形价格表。
荣仔_最靓的仔
2021/02/02
6930
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之组合模式
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之状态模式
应用一: 王者荣耀s19赛季新英雄镜被策划称作史上最难的最花里胡哨的英雄,在她上线后,玩家们也纷纷投身于体验镜这一英雄的热潮中。那么对于王者荣耀新英雄镜技能,研究起来也是别有一番风趣的。简单来说,镜通过一技能——开锋,可以快速向前突进,当触碰到野怪、小兵、敌人时,可突进两段,相反则突进一段;通过二技能——裂空,触碰到野怪小兵等会恢复血量,触碰到的越多、装备越好,回血能力越强,同一技能,若未触碰到目标则不产生回血效果。因此,镜的一二技能触发的技能效果状态是随是否触碰到目标而改变的。
荣仔_最靓的仔
2021/01/30
4420
设计模式23之桥接模式(终章)
在现实生活中,一个物体往往具有多个方面的属性。如果我们将人进行归类。我们可以按性别分类,也可以按肤色分类,也可以按所处的地区分类,还可以按自己的母语分类。
Lvshen
2022/05/05
2730
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之装饰模式
在王者荣耀这款游戏中,英雄在战场上高伤害、高爆发、高移速等是所有玩家共同追求的,那么这些所谓的伤害、移速、穿透力等英雄属性我们可以通过在局外对英雄附带皮肤、配置合适的铭文;以及在局内通过购买装备等多种形式为我们的英雄增加伤害、移速。
荣仔_最靓的仔
2021/01/30
4000
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之单件模式
今年春节王者荣耀出了一个叫做“王者快跑”的限时玩法,许多玩家都很喜欢这个游戏模式。不同于5V5的王者地图,这个地图是一个跑道中途有很多的障碍物,还有NPC玩家释放控制技能做阻拦,简单益智,只要一直跑就可以了,最终按照所有玩家到达终点的时间前后顺序获得名次。
荣仔_最靓的仔
2021/02/02
3800
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之单件模式
设计模式——桥接模式
设计模式——桥接模式
Java架构师必看
2021/05/14
5500
设计模式——桥接模式
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之单件模式
今年春节王者荣耀出了一个叫做“王者快跑”的限时玩法,许多玩家都很喜欢这个游戏模式。不同于5V5的王者地图,这个地图是一个跑道中途有很多的障碍物,还有NPC玩家释放控制技能做阻拦,简单益智,只要一直跑就可以了,最终按照所有玩家到达终点的时间前后顺序获得名次。
荣仔_最靓的仔
2021/01/30
4200
推荐阅读
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之命令模式
5330
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之访问者模式
5890
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之迭代器模式
6080
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式
3380
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之模板方法模式
4150
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之适配器模式
3580
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之抽象工厂模式
3860
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之生成器模式
6590
23种设计模式之桥接模式
2300
设计模式之桥接模式
3100
Java面向对象设计之桥接模式
7211
GoF 23种经典的设计模式——桥接模式
1200
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之代理模式
6840
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之组合模式
6930
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之状态模式
4420
设计模式23之桥接模式(终章)
2730
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之装饰模式
4000
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之单件模式
3800
设计模式——桥接模式
5500
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之单件模式
4200
相关推荐
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之命令模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验