设计模式之桥接模式
来源:互联网 发布:淘宝网儿童内衣 编辑:程序博客网 时间:2024/05/29 10:18
举例:
有两个手机品牌A和B,A品牌手机拥有手游、MP3播放等功能,B手机也拥有手游,MP3播放等功能。
按照手机品牌其代码设计如下:
1、解决方案
按照手机品牌齐代码设计如下:
按照手机软件其代码设计如下:
上面两个的设计方法的问题是:
对象的继承关系是在编译时就定义好了,所以无法再运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化,当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。
因此,在面向对象设计中,还有一个很重要的原则,就是合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承。
2、合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承
(1)聚合表示一种弱的“拥有关系”,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;
(2)合成则是一种强的“拥有”关系,体现了严格地部分和整体的关系,部分和整体的生命周期一样。
(3)合成/聚合如下图示例:
3、只有“is-a”的关系时才使用继承,由于手机品牌和手机软件之间应该属于聚合关系,所以应将手机品牌和手机软件分开设计,代码设计如下::
4、代码实现如下:
首先设计手机软件抽象类
/// <summary>
/// 手机软件抽象类
/// </summary>
public abstract class HandSetSoft
{
public abstract void Run();
}
然后设计手机品牌抽象类:
/// <summary>
/// 手机品牌抽象类
/// </summary>
public abstract class HandSetBrand
{
private string _name;
public HandSetBrand(string name)
{
_name = name;
}
private HandSetSoft _soft; //此处即是聚合的反应
public void SetHandSetSoft(HandSetSoft soft)
{
_soft = soft;
}
public void Run()
{
Console.Write("品牌"+_name);
_soft.Run();
}
}
最后设计手机软件和手机品牌的实现类:
/// <summary>
/// 手机品牌A
/// </summary>
public class HandSetBrandA:HandSetBrand
{
public HandSetBrandA(string name)
: base(name)
{
}
}
/// <summary>
/// 手机品牌B
/// </summary>
public class HandSetBrandB : HandSetBrand
{
public HandSetBrandB(string name)
: base(name)
{
}
}
/// <summary>
/// 手机游戏实现类
/// </summary>
public class HandSetGame:HandSetSoft
{
public override void Run()
{
Console.WriteLine("运行手机游戏");
}
}
/// <summary>
/// MP3软件实现类
/// </summary>
public class HandSetMP3:HandSetSoft
{
public override void Run()
{
Console.WriteLine("运行MP3软件");
}
}
5、总结
桥接模式:实现系统可能有多角度分类(比如按照手机软件分类或者手机品牌分类),每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。
- 设计模式之桥接模式
- C# 设计模式 之 桥接模式
- c#设计模式之[桥接模式]
- 设计模式之桥接模式
- 设计模式之-Bridge-- 桥接模式
- 设计模式之桥接模式
- 设计模式之桥接模式
- 设计模式之Bridge(桥接模式)
- 设计模式之桥接模式
- 设计模式之Bridge(桥接模式)
- 设计模式之桥接模式BridgePattern
- C# 设计模式之桥接模式
- 设计模式之桥接模式
- 设计模式之桥接模式
- Java 设计模式 之 桥接模式
- Java 设计模式 之 桥接模式
- Java 设计模式 之 桥接模式
- 设计模式之桥接模式
- 挂接命令(mount)
- 广点通屡次改版,微信“电商化”缺什么?
- __stdcall,__cdecl,__fastcall的区别
- 神奇的String格式化
- 微信企业号接入(使用SpringMVC)
- 设计模式之桥接模式
- qt中文乱码问题
- 【边做项目边学Android】小白会遇到的问题--创建Android项目不自动生成Activity,layout目录为空
- flex4.6实现图片放大缩小及鼠标拖放事件
- 【HDU】3001 Travelling 状压最短路
- javascript中call和apply函数的使用
- JAVA – 虚函数、抽象函数、抽象类、接口
- 《我的助理辞职了》读后感
- 系统运行慢的原因