前往小程序,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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
容灾系列(三)——云网络容灾建设
网络属于基础设施部分,网络容灾建设作为一个数据中心验收重要指标。试想一个数据中心的网络链路存在单点,就如一个城市道路都是单行道,一旦出现交通事故,小则导致道路拥堵,大则导致整个城市交通瘫痪。IDC时代,业务对网络容灾参与较少,主要依赖数据中心网络容灾建设程度;当到了云的时代,云服务商将底层网络能力产品化后,云上客户更多参与网络容灾建设,提升业务稳定性。本文从云网络概述,云网络容灾复杂度以及典型案例来介绍云网络容灾建设。
开元
2021/08/09
5K0
容灾系列(三)——云网络容灾建设
Elasticsearch跨集群复制(CCR)之腾讯云ES跨地域容灾
腾讯云ES目前已经提供了多可用区部署,即支持同地域跨机房的高可用容灾方案,满足了绝大多数客户的需求。但是依然会有部分客户希望进一步提升容灾级别,能够做到跨地域容灾。随着腾讯云ES双网卡功能的发布,使得跨地域容灾成为可能。接下来我将介绍下腾讯云ES实现跨地域容灾的详细步骤。
吴容
2020/08/18
5.2K3
Elasticsearch跨集群复制(CCR)之腾讯云ES跨地域容灾
混合云演习常见案例
当检测到物理线路1发生故障,系统自动将流量切换至物理线路2,保证业务正常运行。故障修复后,流量自动切回。
怡然自得
2022/06/21
1.5K0
腾讯云高可用网络的修炼之道
当他睡眼惺忪、手拿红牛、嘴刁香烟迈着沉重的步伐从某网络核心机房走出来的时候,除了看门大爷简短问候之外,也只有刚刚过去的这个黑夜才真正懂得刚刚发生了什么,在外人眼里,这个夜晚再正常不过,和往常一样,刷刷微博、看看抖音,逛逛购物网站,即便是前一晚上有某些人觉得打开购物网站的页面有点卡慢,他们也可能不会放在心上,然而正是因为这样一个不一样的网络体验,网络工程师们已经是废寝忘食,鏖战了整整一夜,来修复引发这个网络卡慢的bug,在外人眼里一觉醒来,看似波澜不惊,但有时实则是暗流涌动;
abelbai
2020/10/31
12.5K2
腾讯云高可用网络的修炼之道
腾讯混合云网络设计白皮书
从1999年,公认的云计算先驱-Saleforce.com公司成立,到2006年,Amazon发布了名声大噪的EC2(Elastic Compute Cloud),首次面向公众提供基础架构的云服务产品-IaaS,中间经历了七年的时间。
abelbai
2023/04/26
4.3K1
腾讯混合云网络设计白皮书
Elasticsearch跨集群复制(CCR)之腾讯云ES跨地域容灾
腾讯云ES目前已经提供了多可用区部署,即支持同地域跨机房的高可用容灾方案,满足了绝大多数客户的需求。但是依然会有部分客户希望进一步提升容灾级别,能够做到跨地域容灾。随着腾讯云ES双网卡功能的发布,使得跨地域容灾成为可能。接下来我将介绍下腾讯云ES实现跨地域容灾的详细步骤。
腾讯云大数据
2021/01/08
3.7K0
Elasticsearch跨集群复制(CCR)之腾讯云ES跨地域容灾
腾讯云虚拟网络架构揭秘
腾讯云开发者社区
2017/12/12
9.6K0
混合云应用双活容灾最佳实践
越来越多的企业在数字化转型和上云进程中选择混合云的形态(云+自建 IDC 或云+其他厂商云)来进行容灾建设,一方面不会过度依赖单一云厂商,另一方面还能充分利用已有的线下 IDC 资源。
IT运维技术圈
2022/10/24
3.3K0
数栈数据安全案例:混合云环境数据库备份容灾实现
FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,比如MySQL,HDFS等,也可以采集实时变化的数据,比如MySQL binlog,Kafka等,是全域、异构、批流一体的数据同步引擎,大家如果有兴趣,欢迎来github社区找我们玩~
袋鼠云数栈
2021/05/14
5980
数栈数据安全案例:混合云环境数据库备份容灾实现
记一次混合云API暴露的反思
客户为金融企业对SLA要求及数据安全性很高,有限于考虑到业务的高可用性,采用混合云部署,业务流量入口为阿里金融云,前端可以添加安全设备WAF/CDN/高防IP等,之后Cname到统一入口SLB负载均衡上,后端采用虚拟服务器组,组内ECS部署在同Region的不同Zone,保障跨Zone的靠可用性,考虑到数据的安全性将数据持续化在IDC侧,阿里云与IDC通过云上部署深信服设备与IDC侧Cisco设备通过Ipsec ×××互联(考虑到稳定性目前已经实施专线互通),后端APP-Server与DB-Server部署在IDC,可参考下图:
迅达集团
2019/03/05
1.7K0
记一次混合云API暴露的反思
如何利用腾讯云BGP网络提升客户外网出口的冗余
最近几年,互联网公司发展迅速,有很多互联网公司本身的基础架构都构建在一些公有云厂商之上,除了节省初期投资之外,另外也是借助于一些大的云厂商本身的网络能力,实现业务更好的覆盖。
张小波
2018/10/25
7K2
如何实现混合云场景下的接入层统一?
01. 什么是混合云? 混合云是近年来云计算的主要模式和发展方向,私有云主要是面向企业用户,出于安全考虑,企业更愿意将数据存放在私有云中;但是同时又希望可以获得公有云的计算资源,混合云的诞生就是为了解决云连接的问题。 理论上,任何两个异构的云连接在一起都可称作混合云。它可以是私有云与公有云之间,公有云与公有云之间,甚至是私有云与私有云之间。但通常意义上,我们所指的混合云是指私有云与公有云的混合。 混合云能将不同云之间的资源进行混合和匹配,以获得最佳的效果,这种个性化的解决方案达到了既省钱又安全的目的。多家
腾讯云serverless团队
2021/05/28
1.5K0
容灾系列(一)—— 云上业务容灾方案要如何选?
说起容灾,很多同学脑子冒出来熟悉字眼,”同城双活”,“两地三中心”,“单元化”,“set化”等等。其实这些名词背后均隐射一层含义,面对一些灾难时候,业务如何做冗余来快速恢复业务。
开元
2021/05/18
9.3K1
容灾系列(一)—— 云上业务容灾方案要如何选?
专线相关操作指导—静态、BGP单通道对接
专线相关介绍可参考https://cloud.tencent.com/document/product/216
pinkcchen
2020/11/19
3.8K0
专线相关操作指导—静态、BGP单通道对接
Elasticsearch 跨集群复制(CCR)之腾讯云 ES 跨地域容灾
腾讯云 ES 目前已经提供了多可用区部署,即支持同地域跨机房的高可用容灾方案,满足了绝大多数客户的需求。但是依然会有部分客户希望进一步提升容灾级别,能够做到跨地域容灾。随着腾讯云 ES 双网卡功能的发布,使得跨地域容灾成为可能。接下来我将介绍下腾讯云 ES实现跨地域容灾的详细步骤。 一、对等连接 (https://cloud.tencent.com/document/product/553/18836from=10680) 首先将北京和上海的两个 vpc 建立对等连接,如下图所示: 新建对等链接 注
腾讯云大数据
2020/10/28
2.4K0
容灾系列(五)——数据库容灾建设
在一个数据为王时代,数据安全视为一家企业命根子,因此如何保障企业数据安全尤为重要。本文主要从数据库容灾方案视角,基于当前客户业务并结合技术&产品,制定最佳容灾方案。主要从以下三个方面来介绍:
开元
2021/10/21
8.6K2
容灾系列(五)——数据库容灾建设
中间件PaaS层组件容灾方案及实践
当下,随着数字化技术不断深入,愈来愈多企业将核心业务搬到线上。业务系统高可用、可扩展、容灾能力决定企业系统的连续性,中间件作为构建企业核心系统的重要组成部分,其高可用容灾能力也将决定应用系统的。本文结合腾讯云中间件各PaaS产品的容灾能力及实践,以一个行业头部客户业务容灾实践举例,来展开说明基于腾讯云中间件PaaS层相关产品的实践。
邓愉悦
2021/05/31
4.4K12
基于 Rainbond 的混合云管理解决方案
内容概要:文章探讨了混合云场景中的难点、要点,以及Rainbond平台在跨云平台的混合云管理方面的解决方案。包括通过通过统一控制台对多集群中的容器进行编排和管理,实现了对混合云中应用的一致性管理。文章还介绍了Rainbond平台在混合云环境下的应用模板交付、跨云团队管理等功能,帮助用户简化跨云平台的应用交付和运维操作。
Rainbond开源
2023/05/04
4910
【云+社区年度征文】带宽利用率提升50%,腾讯云联网架构方案解析
导语| 企业A是一家互联网公司,当前在云上计算资源已经接近10W核,华东地域专线流量24G+,资源部署以华东为主、华北、华南、西南等可用区为辅。该企业属于典型的混合云架构,本文主要分享企业A如何通过云联网架构优化实现带宽利用率提升50%?
binwenli
2020/11/30
6K0
【云+社区年度征文】带宽利用率提升50%,腾讯云联网架构方案解析
从架构到应用,全面解析混合云的优势
云计算在2016年有了极大的增长。一方面,AWS、阿里云等大型公有云厂商的云计算收入呈爆发式增长且绝对值数据可观;另一方面,通过持续市场培育,云计算的价值逐步被各国政府所认可。很多大型企业也纷纷发力云计算,传统IDC采购出现增长拐点。各种声音不断提醒人们,云计算不再是雷声大雨点小的噱头,而是成为大中小企业不可或缺的基础设施。2017年,云计算真正落地的话题逐渐成为业界讨论的热门话题。   当前,私有云和公有云相争的热潮渐弱,融合两者优势的混合云开始逐渐释放巨大的市场潜力。混合云的背后不再是厂商,而是一种混合
BestSDK
2018/03/02
1.2K0
从架构到应用,全面解析混合云的优势
推荐阅读
相关推荐
容灾系列(三)——云网络容灾建设
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验