C#之桥接

IronMan之桥接

前言

前面的几个篇幅都是在讲"部件"的生产已经简简单单的使用,以后可能要对"部件"进行升级,不是不对它本身升级,是其它方式的升级,可以让它配备武器。
有没有感觉"部件"是越来越强大了,事物的衍变都是有个过程的嘛,必须要越来越完善,这是"IronMan"设计的宗旨。

好了,废话不多说了,现在所要做的工作就是设计好这个"武器",以便在后面的篇幅中和"部件"很好的结合在一起。来看一下"武器"的定义:


 1     /// <summary>
2 /// 武器
3 /// </summary>
4 public abstract class Weapon
5 {
6 /// <summary>
7 /// 攻击
8 /// </summary>
9 public abstract void Attack();
10 }
11 /// <summary>
12 /// 激光武器
13 /// </summary>
14 public class LaserWeapon : Weapon
15 {
16
17 public override void Attack()
18 {
19 //LaserAttack
20 }
21 }
22 /// <summary>
23 /// 导弹武器
24 /// </summary>
25 public class MissileWeapon : Weapon
26 {
27
28 public override void Attack()
29 {
30 //MissileAttack
31 }
32 }

这样看起来好像没有什么不妥的,因为出于设计的全面性和以便于以后的扩展,所以要尽可能的想的全面。
"武器"的使用也是要受环境限制或影响的。在这里怎么表现出来呢?
先假设两种坏境的下武器使用,一种是水下,一种是太空中(真空状态)


 1     /// <summary>
2 /// 水下的激光武器
3 /// </summary>
4 public class UnderwaterLaserWeapon : LaserWeapon
5 {
6 public override void Attack()
7 {
8 //逻辑处理
9 base.Attack();
10 //逻辑处理
11 }
12 }
13 /// <summary>
14 /// 真空状态下激光武器
15 /// </summary>
16 public class EmptyLaserWeapon : LaserWeapon
17 {
18 public override void Attack()
19 {
20 //逻辑处理
21 base.Attack();
22 //逻辑处理
23 }
24 }
25 /// <summary>
26 /// 水下的导弹武器
27 /// </summary>
28 public class UnderwaterMissileWeapon : MissileWeapon
29 {
30 public override void Attack()
31 {
32 //逻辑处理
33 base.Attack();
34 //逻辑处理
35 }
36 }
37 /// <summary>
38 /// 真空下的导弹武器
39 /// </summary>
40 public class EmptyMissileWeapon : MissileWeapon
41 {
42 public override void Attack()
43 {
44 //逻辑处理
45 base.Attack();
46 //逻辑处理
47 }
48 }

看一下图1所示现在所有类型的结构图

整体的设计是没有大碍的,在增加一项"武器"类型时也是没有问题了,同样遵循着开闭原则。
如果是在添加一种坏境的时候也是遵循着开闭原则的,但是违背了类的单一职责原则,而且这样的设计继承关系太多,不易维护难以扩展,如果这个"武器"是多维的,而且是同时的向着多维前面变化的,那么这个"武器"的结构将会变的庞大无比。
现在应该是"桥接"大展身手的时候了,要在"武器"的两个(或者更多)变化的方向解耦,把强耦合变成弱联系。

实现

原来"武器"的结构不变,只需要在其中的一个维度中提取出抽象(实现类接口),然后"武器"(抽象类)引用从维度中提取出的抽象就好了。
我们来看一下结构:


 1     /// <summary>
2 /// 环境
3 /// </summary>
4 public interface IEnvironment
5 {
6 /// <summary>
7 /// 环境抽象
8 /// </summary>
9 void EnvironmentJudge();
10 }
11 /// <summary>
12 /// 水下环境的
13 /// </summary>
14 public class Underwater : IEnvironment
15 {
16
17 public void EnvironmentJudge()
18 {
19 Console.WriteLine("在水下的");
20 }
21 }
22 /// <summary>
23 /// 真空环境下的
24 /// </summary>
25 public class Empty : IEnvironment
26 {
27
28 public void EnvironmentJudge()
29 {
30 Console.WriteLine("真空下的");
31 }
32 }

上面是 环境维度的结构,下面来看"武器"类型维度的结构:


 1     /// <summary>
2 /// 武器
3 /// </summary>
4 public abstract class Weapon
5 {
6 protected IEnvironment Environment = null;
7 /// <summary>
8 /// 攻击
9 /// </summary>
10 public abstract void Attack();
11 }
12 /// <summary>
13 /// 激光武器
14 /// </summary>
15 public class LaserWeapon : Weapon
16 {
17 public LaserWeapon():this(new Underwater()) { }//默认使用环境为水下
18 public LaserWeapon(IEnvironment environment)
19 {
20 base.Environment = environment;
21 }
22 public override void Attack()
23 {
24 //LaserAttack
25 base.Environment.EnvironmentJudge();
26 Console.WriteLine("激光武器");
27 }
28 }
29 /// <summary>
30 /// 导弹武器
31 /// </summary>
32 public class MissileWeapon : Weapon
33 {
34 public MissileWeapon():this(new Underwater()) { }
35 public MissileWeapon(IEnvironment environment)
36 {
37 base.Environment = environment;
38 }
39 public override void Attack()
40 {
41 //MissileAttack
42 base.Environment.EnvironmentJudge();
43 Console.WriteLine("导弹武器");
44 }
45 }

如图2的所示现在的对象结构:

类型都已经定义完成了,现在来看一下客户端调用代码:


1 //Weapon weapon = new LaserWeapon();//这里已经默认的是水下坏境了
2 Weapon weapon = new MissileWeapon(new Empty());
3 weapon.Attack();

结果如图3所示:

桥接模式就讲到这里. 下一个篇幅将讲到怎么把"武器"安装到"部件"上使用的“装饰者模式”。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

C#之桥接,布布扣,bubuko.com

时间: 2024-11-12 02:52:51

C#之桥接的相关文章

EVE-NG桥接至VMWare主机

打开vmare的"虚拟网络编辑器",如下图增加两个虚拟网络,VMnet2 为NAT模式,用于EVE-NG的管理网卡:VMnet8为Host主机,用于桥接至EVE-NG网络:当然网卡的名称以IP都可以自行定义,看个人的习惯 2. EVE-NG虚拟机网卡以及主机信息如下图.此EVE-NG虚拟机以IOS方案安装,当然也可以OVA模板导       入:具体安装方法参考官网或是百度 3. 修改EVE-NG网卡信息,vi /etc/network/interfaces如下图,当然可以根据个人爱好

设计模式 -- 桥接模式(Bridge Pattern)

桥接模式 Bridge Pattern 结构设计模式 定义: 分离抽象部分和实现部分,使他们独立运行. 避免使用继承导致系统类个数暴增,可以考虑桥接模式. 桥接模式将继承关系转化为关联关系,减少耦合,减少代码量. 例如: public interface Shape { public void bepaint(String color); } public abstract class Color { Shape shape; public void setShape(Shape shape)

设计模式——桥接模式

场景,我们需要给不同的电视厂商,比如长虹.TCL.三星等等生产电视遥控器.他们提供各自电视机遥控功能的实现,并且遵循一样的标准. 我们制作一个长虹的遥控器,选择最直接的方式,继承长虹类,然后利用长虹类提供的方法,实现遥控器功能. 在这个遥控器中,我们提供了新功能,比如 1)将开和关放在一个按钮 2)下一个频道 3)上一个频道 public class CHTvControl extends CHControl implements TvControl{ private static int ch

osgi应用使用桥接的方式打成war包部署在websphere上时遇到的与cxf相关的问题

原来我们的程序都是基于Equinox架构的,但是后面因为要实现打成war包在中间件中部署的需求,使用了eclipse官方提供的桥接方式实现. 桥接的部分后面有时间了我专门写一个文章来说,不明白的暂时请参考eclipse官方文档.这里主要说一下已经桥接成功,但是在使用CXF时遇到问题的情况. 本来在其他中间件里跑得好好的程序,一放到websphere_v8里,就各种报错,都是与axis2有关的,但是我们的项目并没有使用axis2,而是使用cxf. 报错类似如下(我有3个环境,每个报的错都不同,不过

浅说解决VMware桥接模式连接主机

内容概要: 1: 搞懂VMware的桥接,NAT,HostOnly三种模式的意义. 2: 分别示范,CentOS 6,CentOS 7的手动分配固定虚拟机的IP地址. 3: 使用桥接方法ping通主机,并用Xshell远程控制. 解决的问题: 1: 虚拟机上不了网. 2: 无法ping通主机或远程连接. 3: 网卡启动总是失败,报错. 写作目的: 初装linux后,我们会习惯性的ping一下主机,看看虚拟机是否和主机连接正常,若正常便会迫不及待的用Xshell远程连接虚拟机,进行验证并操作.可安

6.EVE-NG网卡桥接,带您走进更高级的实验

文章列表(关注微信公众号EmulatedLab,及时获取文章以及下载链接) 1.EVE-NG介绍(EVE-NG最好用的模拟器,仿真环境时代来临!) 2.EVE-NG安装过程介绍 3.EVE-NG导入Dynamips和IOL 4.EVE-NG导入QEMU镜像 5.EVE-NG关联SecureCRT,VNC,Wireshark 6.EVE-NG网卡桥接,带您走进更高级的实验 7.EVE-NG硬盘扩容,存储海量镜像 8.EVE-NG定制个人镜像,脚本快速导入 9.EVE-NG容纳H3C.Huawei,

9,桥接模式(Bridge Pattern)是将抽象部分与实际部分分离,使它们都可以独立的变化。

Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任. 它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展.  适用于: 桥接模式(Bridge Pattern)是将抽象部分与实现部分分离(解耦合),使它们都可以独立的变化. 车 安装 发动机 :不同型号的车,安装不同型号的发动机        将"车

【结构型模式】《大话设计模式》——读后感 (13)手机软件何时能统一?——桥接模式

桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变换[DP] 概述:在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式. 桥接模式的基本代码: 唯独一: AbstractCar: package com.sjmx.bridge; public abstract class AbstractCar { void r

VMware之无法切换桥接网络

一.关闭正在运行的虚拟机 二.打开虚拟网络编辑器 三.还原默认设置 四.启动虚拟机即可正常使用桥接网络

CentOS桥接上网设置方式

1)设置虚拟机使用桥接模式. 打开新建的虚拟机,点击网络适配器.选择桥接模式. 2)设置VMware网络工作方式为桥接模式. 在VMware菜单中,选择[编辑]=>[虚拟网络编辑器].选中VMnet0,在桥连接模式中,桥接到无线网或者本地连接.由于我用的是笔记本,桥接到无线网,所以桥接到[1X1 11b/g/n 无线局域网PCI Express half Mini Cart适配器]. 3)查询局域网网关. 在本机windows中,打开cmd.在cmd中输入.ipconfig /all.即可查找到