设计模式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();
        }
    }
}
此时会发现增加一个新类除了武器类名不一样其他都是一样的,导致这个原因是该项目不需要,如果在需要一些热武器就可以去除其原有的抽象实现部分,因项目而异


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现对Html文本的处理

1.引入jsoup <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.8.3</version> </dependency> 2. html示例 示例代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1…

【Linux】 man命令使用

介绍 man命令是Linux下最核心的命令之一。而man命令也并不是英文单词“man”的意思&#xff0c;它是单词manual的缩写&#xff0c;即使用手册的意思。 man命令会列出一份完整的说明。 其内容包括命令语法、各选项的意义及相关命令 。更为强大的是&#xff0c;不仅可以查看Lin…

Kali Linux:网络与安全专家的终极武器

文章目录 一、Kali Linux 简介二、Kali Linux 的优势三、使用 Kali Linux 进行安全任务推荐阅读 ——《Kali Linux高级渗透测试》适读人群内容简介作者简介目录 Kali Linux&#xff1a;网络与安全专家的终极武器 Kali Linux&#xff0c;对于许多网络和安全专业人士来说&#x…

InetAddress.getLocalHost() 执行非常慢

昨天同事反馈网关的请求非常慢&#xff0c;一个获取的token的接口响应都超过了30s&#xff0c;还好只是测试环境。 经过验证&#xff0c;几乎所有接口响应都很慢&#xff0c;很多都响应超时。 排查步骤&#xff1a; 0. 本地启动项目测试&#xff0c;没有这个问题。而且生产环…

Python基础之列表、元组和字典

一文拿捏Python基本数据类型“列表、数组和字典” 引言 Python中的 列表(英文叫list) 、 元组(英文叫tuple)和字典&#xff08;dictionary&#xff09; 也是 序列 特性的&#xff0c;它们也是非常常用的数据类型。 1、列表&#xff08;List&#xff09; 01、概述 列表&#…

【Ubuntu】虚拟机安装系统与初始化配置

一、安装ubuntu系统 1、首先在虚拟机上安装一个虚拟机系统。 简单操作忽略&#xff0c;只贴出与安装linux不同的地方。 内存&#xff0c;处理器&#xff0c;磁盘等什么自己看着需要自己增加们这边不做过多说明。一直下一步&#xff0c;然后就安装好了。2、选择镜像位置然后启…

华为RS设备状态及接口配置命令

1、查看硬件信息 ①查看序列号 查看整机序列号 display esn display sn ②、查看功率 电源功率 display power 查看光模块功率 display transceiver interface gigabitethernet 1/0/0 verbose ③、查看风扇 display fan ④、查看温度 display temperature all ⑤、查看硬…

【MySQL】索引(下)

文章目录 1. 普通索引2. 索引操作创建主键索引查询索引删除索引唯一索引的创建删除唯一键索引普通索引的创建全文索引 1. 普通索引 MySQL除了会默认建立主键索引&#xff0c;也可能会按照其他列信息建立的索引&#xff0c;一般这种索引称为 普通索引 对于 储存引擎 myisam&…

伊朗网络间谍组织针对中东金融和政府部门

导语 近日&#xff0c;以色列网络安全公司Check Point与Sygnia发现了一起针对中东金融、政府、军事和电信部门的网络间谍活动。这一活动由伊朗国家情报和安全部门&#xff08;MOIS&#xff09;支持的威胁行为者发起&#xff0c;被称为"Scarred Manticore"。该组织被认…

在Linux上通过NTLM认证连接到AD服务器(未完结)

这篇文章目前还没有实现具体的功能&#xff0c;只实现了明文登录&#xff0c;因为我缺少一些数据&#xff0c;比如通过密码生成hash&#xff0c;以及通过challenge生成response&#xff0c;我不知道怎么实现&#xff0c;因此这篇文章也是一个交流的文章&#xff0c;希望大佬看见…

【实战Flask API项目指南】之一 概述

实战Flask API项目指南之 概述 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握Flask在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 小菜是一个Python编程爱好者&#xff0c;他目前…

蓝桥杯 (C++ 求和 等差数列 顺子日期 灌溉)

目录 1、求和 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 2、等差数列 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 3、顺子日期 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 4、灌溉 题目&#xff1a; 代码&#xff1a; 1、求和…

KaiwuDB 内核解析 - SQL 查询的生命周期

一、概述 KaiwuDB 内核解析系列共分上下两部分&#xff0c;本文是该系列的第一部分&#xff0c;主要涵盖了网络协议到 SQL 执行器&#xff0c;解释 KaiwuDB 如何执行 SQL 查询&#xff0c;包括系统各个组件的执行路径&#xff08;网络协议、SQL 会话管理、解析器、执行计划及优…

【Spring MVC】Spring MVC框架的介绍及其使用方法

目录 一、MVC模式 1.1 MVC模式的发展 1.1.1 Model1 模型 1.1.2 Model2 模型 1.2 MVC模式简介 1.模型(Model) 2.视图(View) 3.控制器(Controller) 二、Spring MVC模型简介 三、Spring MVC 六大核心组件 3.1 六大组件简介 1.前端控制器 DispatcherServlet&#xff08…

Notepad++下载、使用

下载 https://notepad-plus-plus.org/downloads/ 安装 双击安装 选择安装路径 使用 在文件夹中搜索 文件类型可以根据需要设置 如 *.* 说明是所有文件类型&#xff1b; *.tar 说明是所有文件后缀是是tar的文件‘&#xff1b;

多个PDF发票合并实现一张A4纸打印2张电子/数电发票功能

python教程79--A4纸增值税电子发票合并打印_python 打印 发票设置_颐街的博客-CSDN博客文章浏览阅读7.9k次。接上篇https://blog.csdn.net/itmsn/article/details/121902974?spm1001.2014.3001.5501一张A4纸上下2张增值税电子发票实现办法。使用环境&#xff1a;python3.8、ma…

JAVA 实现PDF转图片(pdfbox版)

依赖&#xff1a; pdf存放路径 正文开始&#xff1a; pdf转换多张图片、长图 Test void pdf2Image() {String dstImgFolder "";String PdfFilePath "";String relativelyPathSystem.getProperty("user.dir");PdfFilePath relativelyPath &qu…

Ps:PSDT 模板文件

自 Photoshop CC 2015.5 版以后&#xff0c;Ps 中新增了一种文件格式&#xff1a;.PSDT。 说明&#xff1a; PSD、PDD、PSDT 都是 Ps 的专用文件格式&#xff0c;需要继续在 Ps 中进行编辑的文件可存为此类格式。 PSD Photoshop document Photoshop 默认文档格式&#xff0c;支…

选择适合你的办公桌:提高工作效率的关键

​在如今的数字时代&#xff0c;越来越多的人将办公桌移到家里或办公室。但是&#xff0c;如何选择适合你的办公桌可能是个挑战。不同的工作需要和工作空间大小会影响你的选择。下面是一些简单的建议&#xff0c;帮助你找到适合你的办公桌&#xff0c;提高工作效率。 首先&…

使用pytorch处理自己的数据集

目录 1 返回本地文件中的数据集 2 根据当前已有的数据集创建每一个样本数据对应的标签 3 tensorboard的使用 4 transforms处理数据 tranfroms.Totensor的使用 transforms.Normalize的使用 transforms.Resize的使用 transforms.Compose使用 5 dataset_transforms使用 1 返回本地…