C#设计模式之桥接
IronMan之桥接
前言
前面的几个篇幅都是在讲"部件"的生产已经简简单单的使用,以后可能要对"部件"进行升级,不是不对它本身升级,是其它方式的升级,可以让它配备武器。 有没有感觉"部件"是越来越强大了,事物的衍变都是有个过程的嘛,必须要越来越完善,这是"IronMan"设计的宗旨。
好了,废话不多说了,现在所要做的工作就是设计好这个"武器",以便在后面的篇幅中和"部件"很好的结合在一起。来看一下"武器"的定义:
/// <summary>
/// 武器
/// </summary>
public abstract class Weapon
{
/// <summary>
/// 攻击
/// </summary>
public abstract void Attack();
}
/// <summary>
/// 激光武器
/// </summary>
public class LaserWeapon : Weapon
{ public override void Attack()
{
//LaserAttack
}
}
/// <summary>
/// 导弹武器
/// </summary>
public class MissileWeapon : Weapon
{ public override void Attack()
{
//MissileAttack
}
}
这样看起来好像没有什么不妥的,因为出于设计的全面性和以便于以后的扩展,所以要尽可能的想的全面。
"武器"的使用也是要受环境限制或影响的。在这里怎么表现出来呢?
先假设两种坏境的下武器使用,一种是水下,一种是太空中(真空状态)
/// <summary>
/// 水下的激光武器
/// </summary>
public class UnderwaterLaserWeapon : LaserWeapon
{
public override void Attack()
{
//逻辑处理
base.Attack();
//逻辑处理
}
}
/// <summary>
/// 真空状态下激光武器
/// </summary>
public class EmptyLaserWeapon : LaserWeapon
{
public override void Attack()
{
//逻辑处理
base.Attack();
//逻辑处理
}
}
/// <summary>
/// 水下的导弹武器
/// </summary>
public class UnderwaterMissileWeapon : MissileWeapon
{
public override void Attack()
{
//逻辑处理
base.Attack();
//逻辑处理
}
}
/// <summary>
/// 真空下的导弹武器
/// </summary>
public class EmptyMissileWeapon : MissileWeapon
{
public override void Attack()
{
//逻辑处理
base.Attack();
//逻辑处理
}
}
看一下图1所示现在所有类型的结构图

整体的设计是没有大碍的,在增加一项"武器"类型时也是没有问题了,同样遵循着开闭原则。
如果是在添加一种坏境的时候也是遵循着开闭原则的,但是违背了类的单一职责原则,而且这样的设计继承关系太多,不易维护难以扩展,如果这个"武器"是多维的,而且是同时的向着多维前面变化的,那么这个"武器"的结构将会变的庞大无比。
现在应该是"桥接"大展身手的时候了,要在"武器"的两个(或者更多)变化的方向解耦,把强耦合变成弱联系。
实现
原来"武器"的结构不变,只需要在其中的一个维度中提取出抽象(实现类接口),然后"武器"(抽象类)引用从维度中提取出的抽象就好了。
我们来看一下结构:
/// <summary>
/// 环境
/// </summary>
public interface IEnvironment
{
/// <summary>
/// 环境抽象
/// </summary>
void EnvironmentJudge();
}
/// <summary>
/// 水下环境的
/// </summary>
public class Underwater : IEnvironment
{ public void EnvironmentJudge()
{
Console.WriteLine("在水下的");
}
}
/// <summary>
/// 真空环境下的
/// </summary>
public class Empty : IEnvironment
{ public void EnvironmentJudge()
{
Console.WriteLine("真空下的");
}
}
上面是 环境维度的结构,下面来看"武器"类型维度的结构:
/// <summary>
/// 武器
/// </summary>
public abstract class Weapon
{
protected IEnvironment Environment = null;
/// <summary>
/// 攻击
/// </summary>
public abstract void Attack();
}
/// <summary>
/// 激光武器
/// </summary>
public class LaserWeapon : Weapon
{
public LaserWeapon():this(new Underwater()) { }//默认使用环境为水下
public LaserWeapon(IEnvironment environment)
{
base.Environment = environment;
}
public override void Attack()
{
//LaserAttack
base.Environment.EnvironmentJudge();
Console.WriteLine("激光武器");
}
}
/// <summary>
/// 导弹武器
/// </summary>
public class MissileWeapon : Weapon
{
public MissileWeapon():this(new Underwater()) { }
public MissileWeapon(IEnvironment environment)
{
base.Environment = environment;
}
public override void Attack()
{
//MissileAttack
base.Environment.EnvironmentJudge();
Console.WriteLine("导弹武器");
}
}
如图2的所示现在的对象结构:

类型都已经定义完成了,现在来看一下客户端调用代码:
//Weapon weapon = new LaserWeapon();//这里已经默认的是水下坏境了
Weapon weapon = new MissileWeapon(new Empty());
weapon.Attack();
结果如图3所示:

桥接模式就讲到这里. 下一个篇幅将讲到怎么把"武器"安装到"部件"上使用的“装饰者模式”。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
C#设计模式之桥接的更多相关文章
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- java面试题之----jdbc中使用的设计模式(桥接模式)
1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...
- 设计模式:桥接(Bridge)模式
设计模式:桥接(Bridge)模式 一.前言 写到这里,基本上就是对前面几种模式的扩展和区别了,可以看到我们前面的几种模式,很多时候都出现了重叠,这里要分清一个概念,模式并不是完全隔离和独立的,有 ...
- php设计模式之桥接模式
php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...
- java设计模式7——桥接模式
java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...
- C++设计模式-Bridge桥接模式
作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...
- 设计模式之桥接模式(Bridge)
注:本文不属于原创,而是根据原文重新整理,原文是:我给媳妇解释设计模式:第一部分 设计模式不是基于理论发明的.相反,总是先有问题场景,再基于需求和情景不断演化设计方案,最后把一些方案标准化成“模式”. ...
- 【GOF23设计模式】桥接模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_桥接模式.多层继承结构.银行日志管理.管理系统消息管理.人力资源的奖金计算 未用桥接模式: package com.te ...
- js设计模式(3)---桥接模式
0.前言 看设计模式比较痛苦,一则是自己经验尚浅,不能体会到使用这些设计模式的益处:二则是不能很好把握使用这些设计模式的时机.所以这一部分看得断断续续,拖拖拉拉,为了了却这快心病,决定最近一口气看完几 ...
- [设计模式] 7 桥接模式 bridge
#include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...
随机推荐
- .NET程序运行过程产生的问题
1.数据兼容性 功能模块的开发,会影响历史数据以及新数据的更新和体现.比如开发功能007,007支持了金额可变,数量不可变的原理.而历史数据均是数量可变,金额不可变的原理.此时,就会产生了问题. 2. ...
- Effective C++ 笔记2(构造,析构,赋值)
条款5:了解C++默默编写并且调用了哪些函数 1. 构造函数,析构函数,拷贝赋值函数,拷贝构造函数. class Empty { public: //默认构造函数 Empty(){}; //拷贝构造 ...
- 6种方法实现asp.net返回上一页
其实要实现返回上一页的功能,主要还是要用到JavaScript. 一: 在ASP.net的aspx里面的源代码中 <input type="button onclick="J ...
- Java多线程之构造与发布
资料来源 http://www.ibm.com/developerworks/library/j-jtp0618/ http://www.javaspecialists.eu/archive/Issu ...
- 学习CSS3动画(animation)
CSS3就是出了不少高大上的功能,3D效果.动画.多列等等.今天写篇文章记录怎么一下怎么用CSS3写一个动画. 丑话还得说前头,IE9以及以下版本不支持CSS3动画(如真要实现可以考虑用js,不过估计 ...
- Linux基础命令-有关于目录的命令
1. 查看帮助: [root@oracle ~]# man cd //查看 cd 指令的帮助文档 2. 显示当前工作目录: [root@oracle ~]# pwd/root 3. 列出当前目录下的内 ...
- Thinkphp3.2.3使用Ajax一定注意 数据返回
Thinkphp3.2.3使用Ajax一定注意 数据返回 $data = 'ok'; $this->ajaxReturn($data); 不能直接 echo $data;
- iOS 中 ARC 项目 兼容 MRC
iOS 项目中MRC 和 ARC 项目的代码兼容问题: 1.ARC 项目中导入 MRC 第三方类的时候要在此类上添加 -objc-arc. 2.MRC 项目中导入 ARC 类的时候要在次类上添加 -f ...
- Web服务网站故障分析常用的命令
1.查看TCP连接状态netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn netstat -n | awk ‘/^tcp/ {++S[$NF]}; ...
- Java的四种引用方式
一.引用基本概念 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用.虚引用. 1.强引用(StrongRef ...