设计模式04———桥接模式 c#

桥接模式:将一个事物从多个维度抽象出来,采用 分离 和 组合 的方式 替代 原本类的继承

桥接模式(Bridge Pattern)是一种软件设计模式,属于结构型模式,它用于将抽象部分与具体实现部分分离,以便它们可以独立地变化。这种模式通过创建一个连接(桥)来将抽象和实现部分分离,从而允许它们可以独立地进行扩展和变化。

桥接模式的主要目标是解耦抽象部分(如类或对象)和实现部分(如具体类或对象),从而可以分别对它们进行扩展或修改,而不会相互影响。这提供了更大的灵活性和可维护性,特别是在需要支持多种不同的抽象和实现组合的情况下。

通常,桥接模式包括以下角色:

  1. 抽象(Abstraction):定义抽象部分的接口,并维护一个指向实现部分的引用。通常包含抽象方法,用于委托实现部分完成具体工作。

  2. 具体抽象(Concrete Abstraction):实现抽象接口,通常是一个具体类,它与实现部分关联,将抽象方法的调用委托给实现部分。

  3. 实现(Implementor):定义实现部分的接口,通常包含实现方法,这些方法可以被具体实现类重写以提供不同的实现。

  4. 具体实现(Concrete Implementor):实现实现接口,提供具体的实现逻辑。

桥接模式的典型应用包括在图形系统中将不同的形状(抽象部分)和不同的颜色(实现部分)组合起来,以实现各种不同的图形。通过使用桥接模式,可以轻松地添加新的形状或颜色,而不需要修改已有的代码,实现了系统的可扩展性和可维护性。这是一个典型的例子,但桥接模式在各种其他领域也有广泛的应用。

namespace BridgePatternFour{
    //魔法效果抽象类
    public abstract class IMagic{
        //施放魔法
        public abstract void Cast();
    }
}

using System;
namespace BridgePatternFour{
    public class MagicFire : IMagic{
        public override void Cast(){
            Console.WriteLine("同时释放火焰魔法");
        }
    }
}

using System;
namespace BridgePatternFour{
    public class MagicSnow : IMagic{
        public override void Cast(){
            Console.WriteLine("同时释放冰冻魔法");
        }
    }
}
 

抽象武器基类

武器子类

using System;
namespace BridgePatternFour{
    public class WeaponSword : IWeapon{
        public WeaponSword(string name, IMagic magic) : base(name, magic){
        }
        public override void Attack(){
            //待改进写死的实现  
            Console.WriteLine($"挥舞{Name}发动攻击");
            //抽象部分
            _magic.Cast();
        }
    }
}
动作基类

namespace BridgePatternFour{
    public abstract class IAction{
        //动作名称
        public string Name { set; get; }
        //播放动作动画
        public abstract void Behaviour();
        public IAction(string name) {
            Name = name;
        }
    }
}
动作子类

using System;
namespace BridgePatternFour{
    public class ActionStab : IAction{
        public ActionStab(string name) : base(name){
        }
        public override void Behaviour(){
            Console.WriteLine($"播放{Name}刺动作");
        }
    }
}

using System;
namespace BridgePatternFour{
    public class ActionCut : IAction{
        public ActionCut(string name) : base(name){
        }
        public override void Behaviour(){
            Console.WriteLine($"播放{Name}砍动作");
        }
    }
}

更新武器基类

namespace BridgePatternFour{
    public abstract class IWeapon{
        //武器名称
        public string Name { get; set; }
        //魔法的引用
        protected IMagic _magic = null;
        //动作的引用
        protected IAction _action = null;
        //构造方法
        public IWeapon(string name, IMagic magic) {
            Name = name;
            _magic = magic;
        }
        //抽象攻击方法
        public abstract void Attack();
        //设置动作
        //注意:此方法不许重写,延申到子类没有意义
        public void SetAction(IAction action) {
            _action = action;
        }  
    }
}

更新武器子类

using System;
namespace BridgePatternFour{
    public class WeaponSword : IWeapon{
        public WeaponSword(string name, IMagic magic) : base(name, magic){
        }
        public override void Attack(){
            Console.WriteLine($"{Name}发动攻击");
            //抽象部分
            if(_action != null)
                _action.Behaviour();
            //抽象部分
            if(_magic != null)
                _magic.Cast();
        }
    }
}
修改动作基类 接近接口

namespace BridgePatternFour{
    public abstract class IAction{
        //动作名称
        protected string Name { set; get; }
        //播放动作动画
        public abstract void Behaviour();
    }
}
修改动作子类

using System;
namespace BridgePatternFour{
    public class ActionStab : IAction{
        public override void Behaviour(){
            Console.WriteLine($"播放{Name}刺动作");
        }
    }
}

using System;
namespace BridgePatternFour{
    public class ActionStab : IAction{
        public override void Behaviour(){
            Console.WriteLine($"播放{Name}刺动作");
        }
        public ActionStab() {
            Name = "刺";
        }
    }
}
同样

using System;
namespace BridgePatternFour{
    public class ActionCut : IAction{
        public override void Behaviour(){
            Console.WriteLine($"播放{Name}砍动作");
        }
        public ActionCut() {
            Name = "砍";
        }
    }
}
更新Program类

namespace BridgePatternFour{
    public class Program{
        public static void Main(string[] args) {
            IWeapon weapon = new WeaponSword("倚天剑", new MagicSnow());
            weapon.SetAction(new ActionStab());
            weapon.Attack();
        }
    }
}
此时是单维度的(单剑),加一个弓变成双维度(双剑弓)

using System;
namespace BridgePatternFour{
    public class WeaponBow : IWeapon{
        public WeaponBow(string name, IMagic magic) : base(name, magic){
        }
        public override void Attack(){
            Console.WriteLine($"{Name}发动攻击");
            //抽象部分
            if (_action != null)
                _action.Behaviour();
            //抽象部分
            if (_magic != null)
                _magic.Cast();
        }
    }
}
此时会发现增加一个新类除了武器类名不一样其他都是一样的,导致这个原因是该项目不需要,如果在需要一些热武器就可以去除其原有的抽象实现部分,因项目而异


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/112913.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jorani远程命令执行漏洞 CVE-2023-26469

Jorani远程命令执行漏洞 CVE-2023-26469 漏洞描述漏洞影响漏洞危害网络测绘Fofa: title"Jorani"Hunter: web.title"Jorani" 漏洞复现1. 获取cookie2. 构造poc3. 执行命令 漏洞描述 Jorani是一款开源的员工考勤和休假管理系统,适用于中小型企业…

EASYX实现多物体运动

eg1:单个物体运动使用easyx实现单个小球的运动 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14 #define NODE_WIDTH 4…

API接口的定义|电商API接口的接入测试和参数说明【附代码实例教程】

一 . API接口的定义 API全称Application Programming Interface&#xff0c;即应用程序编程接口&#xff0c;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定&#xff0c;用于传输数据和指令&#xff0c;使应用程序之间可以集成和共享数据资源。 简单来…

Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4)

Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View&#xff0c;Kotlin&#xff08;4&#xff09; import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import a…

Jetson NX FFmpeg硬件编解码实现

最近在用Jetson Xavier NX板子做视频处理&#xff0c;但是CPU进行视频编解码&#xff0c;效率比较地下。 于是便考虑用硬解码来对视频进行处理。 通过jtop查看&#xff0c;发现板子是支持 NVENC硬件编解码的。 1、下载源码 因为需要对ffmpeg进行打补丁修改&#xff0c;因此需…

无需服务器内网穿透Windows下快速搭建个人WEB项目

&#x1f4d1;前言 本文主要是windows下内网穿透文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ 参考自&#xff1a;Windows搭建web站点&#xff1a;免费内网穿透发布至公网 &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首…

Java算法:二分查找

一、 二分查找注意 前提是数组必须是有序的&#xff0c;否则无法正常工作。如果数组不是有序的&#xff0c;需要先对数组进行排序&#xff0c;然后才能使用二分查找算法。 二、二分查找高效算法 二分查找也称为折半查找&#xff0c;是一种在有序数组中查找目标元素的算法。它的…

【嵌入式开发学习02】esp32cam烧录human_face_detect实现人脸识别

Ubuntu20.04系统为esp32cam烧录human_face_detect 1. 下载esp-dl2. 安装esp-idf3. 烧录human_face_detect 如果使用ubuntu 16.04在后续的步骤中会报错如下&#xff0c;因为ubuntu 16.04不支持glibc2.23以上的版本&#xff08;可使用strings /lib/x86_64-linux-gnu/libc.so.6 | …

护眼灯有没有护眼的效果?适合学生儿童的五款护眼台灯推荐

如果不想家里的孩子年纪小小的就戴着眼镜&#xff0c;从小就容易近视&#xff0c;那么护眼灯的选择就非常重要了&#xff0c;但是市场上那么多品类&#xff0c;价格也参差不齐&#xff0c;到底怎么选呢&#xff1f;大家一定要看完本期内容。为大家推荐最热门的五款护眼台灯。 1…

HTML、CSS和JavaScript,实现换肤效果的原理

这篇涉及到HTML DOM的节点类型、节点层级关系、DOM对象的继承关系、操作DOM节点和HTML元素 还用到HTML5的本地存储技术。 换肤效果的原理&#xff1a;是在选择某种皮肤样式之后&#xff0c;通过JavaScript脚本来加载选中的样式&#xff0c;再通过localStorage存储。 先来回忆…

Spring MVC (Next-1)

1.Restful请求 restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的&#xff0c;可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。 rest请求方法有4种&#xff0c;包括get,post,put,delete.分别对应获取…

CRM系统数据库是如何影响客户体验的?

CRM客户关系管理由概念到软件实体&#xff0c;已经有几十年的时间&#xff0c;随着信息技术的进步&#xff0c;数字化让CRM软件乘上快车&#xff0c;迅速成为各类企业的数字化管理工具。CRM客户管理系统的一个重要功能便是改善并提升客户体验&#xff0c;且CRM数据库是与客户体…

【笔记】excel怎么把汉字转换成拼音

1、准备好excel文件&#xff0c;复制需要转拼音列。 2、打开一个空白Word文档&#xff0c;并粘贴刚才复制的内容&#xff1b; 3、全选Word文档中刚粘贴的内容&#xff0c;点击「开始」选项卡「字体」命令组下的「拼音指南」&#xff0c;调出拼音指南对话框&#xff1b; 4、全…

如何调整职场心态,提高工作表现

文章目录 介绍职场分析对比历年职场需求开发者地域分布开发者工作状态职场晋升之路 职场经验控制情绪保持好奇心提升核心能力 职场转行结论 介绍 职场中的心态调整对于我们在工作中表现的影响非常重要。作为一名全栈开发者&#xff0c;我深知在 AI 算法和云技能领域工作的挑战…

【生物信息学】单细胞RNA测序数据分析:计算亲和力矩阵(基于距离、皮尔逊相关系数)及绘制热图(Heatmap)

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 读取数据集2. 质量控制&#xff08;可选&#xff09;3. 基于距离的亲和力矩阵4. 绘制基因表达的Heatmap5. 基于皮尔逊相关系数的亲和力矩阵6. 代码整合 一、实验介绍 计算亲和力…

云服务器 centos 部署 code-server 并配置 c/c++ 环境

将你的云服务器改为 centos 8 为什么要将云服务器的操作系统改成 centos 8 呢&#xff1f;原因就是 centos 7 里面的配置满足不了 code-server 的需求。如果你使用的是 centos 7 那么就需要你升级一些东西&#xff0c;这个过程比较麻烦。我在 centos 7 上面运行 code-server 的…

[学习笔记]python绘制图中图(绘制站点分布图)

背景 在绘制站点分布图时&#xff0c;有时需要采用图中图的方式&#xff0c;以便于在一张图中尽可能多的表达信息。此处记录一下利用python matplotlib绘制图中图的脚本&#xff0c;方便然后查询。 包含数据 该绘图脚本中包含以下数据&#xff1a; CMONOC站点分布&#xff…

CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板

目录 CVPR2024官网&#xff1a; CVPR2024投稿链接&#xff1a; CVPR2024 重要时间节点&#xff1a; CVPR2024投稿模板: WORD: LATEX : CVPR2024_AuthorGuidelines CVPR2024投稿Topics&#xff1a; CVPR2024官网&#xff1a; https://cvpr.thecvf.com/Conferences/2024CV…

pytorch复现4_Resnet

ResNet在《Deep Residual Learning for Image Recognition》论文中提出&#xff0c;是在CVPR 2016发表的一种影响深远的网络模型&#xff0c;由何凯明大神团队提出来&#xff0c;在ImageNet的分类比赛上将网络深度直接提高到了152层&#xff0c;前一年夺冠的VGG只有19层。Image…

正点原子嵌入式linux驱动开发——Linux USB驱动

USB是很常用的接口&#xff0c;目前大多数的设备都是USB接口的&#xff0c;比如鼠标、键盘、USB摄像 头等&#xff0c;在实际开发中也常常遇到USB接口的设备&#xff0c;本章就来学习一下如何使能Linux内核自带的USB驱动。这里不会具体学习USB的驱动开发。 USB接口简介 什么是…