桥接模式:它是一种非常重要的软件设计模式,它的作用是:将抽象部分与实现部分分离,使它们可以互相独立的变化。
开放—封闭原则:简单的说就是,使软件可以扩展,但是不可以修改,就是说软件可以添加功能但是不改变源代码。
合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。
今天借桥接模式的例子来理解一下桥接模式,以及开放-封闭原则、合成/聚合原则,那么下面大家先看一下下面这个例子
//手机软件抽象类
abstract class HandsetSoft
{
public abstract void Run();
}
//手机软件具体类
class HandsetGame : HandsetSoft //手机游戏软件
{
public override void Run()
{
Console.WriteLine("运行手机游戏") ;
}
}
class HandsetAddressList : HandsetSoft //手机通讯录软件
{
public override void Run()
{
Console.WriteLine("运行手机通讯录");
}
}
//手机品牌抽象类
abstract class HandsetBrand
{
protected HandsetSoft soft;
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
public abstract void Run();
}
//手机品牌具体类
class HandsetBrandN : HandsetBrand //品牌N
{
public override void Run()
{
soft.Run();
}
}
class HandsetBrandM : HandsetBrand //品牌M
{
public override void Run()
{
soft.Run();
}
}
//客户段调用代码
static void Main(string[] args)
{
HandsetBrand ab;
ab = new HandsetBrandN();
ab.SetHandsetSoft(new HandsetGame());
ab.Run();
ab.SetHandsetSoft(new HandsetAddressList());
ab.Run();
ab = new HandsetBrandM();
ab.SetHandsetSoft(new HandsetGame());
ab.Run();
ab.SetHandsetSoft(new HandsetAddressList());
ab.Run();
Console.Read();
}
First 桥接模式
在上述例子中,手机可以用品牌来分类,也可以用功能来分类,所以它的实现方式多种多样,也就是说各自可以独立的变化,这就是桥接模式的核心。
Second 开发-封闭原则
上面说过,开闭原则就是允许扩展不允许修改,再看上面这个例子,我们可以随意的添加游戏功能类,比如添加一个视频播放功能:
class HandsetVideoPlayer :HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行视频播放")
}
}
只要添加这段代码就可以,完全不需要对源代码做任何修改,即符合了开放-封闭原则。
Third 合成/聚合复用原则
在上述例子中,手机品牌包含有手机软件,但软件不是品牌的一部分,所以属于聚合关系,所以在手机软件类中实现手机软件类的通信,这就是合成/聚合复用原则的小应用。
因为继承属于强耦合,在某些时候有可能会形成庞大的代码量。比如上述例子中,如果手机软件继承手机品牌的话,那每添加一个手机品牌就需要重新写一次手机软件的功能,而这就会影响代码的灵活性,也会增加不必要的代码量;而
合成/聚合复用好处是有助于保持每个对象的封装,并被集中在单个任务上,这样类和类继承层次会保持在较小规模,不太可能形成庞然大物。
当然了,也不是说什么时候都要用这个原则,比如让具体功能继承手机软件类就非常好,如果换成合成/聚合原则,可能会一团糟,我们要慢慢学习在最合适的时候使用最合适的设计模式。
好了,本次博客到此结束,欢迎大家提出宝贵的意见和建议。