本文借鉴《大话设计模式》,算是对自己学习的总结,也希望分享下所学知识~~
case 1:
两个手机品牌,都有游戏和通讯录功能。
如果使用继承模式:
1.定义一个手机品牌类。
2.有两个手机品牌,M和N。
class HandsetBrand
{
public virtual void Run()
{
}
}
class HandsetBrandM : HandsetBrand
{
}
class HandsetBrandN : HandsetBrand
{
}
每个手机都有游戏和通讯录功能。
class HandsetBrandMGame : HandsetBrandM
{
public override void Run()
{
Console.WriteLine("运行 M 牌手机游戏");
}
}
class HandsetBrandMAddressList : HandsetBrandM
{
public override void Run()
{
Console.WriteLine("运行 M 牌手机通讯录");
}
}
class HandsetBrandNGame : HandsetBrandM
{
public override void Run()
{
Console.WriteLine("运行 N 牌手机游戏");
}
}
class HandsetBrandNAddressList : HandsetBrandM
{
public override void Run()
{
Console.WriteLine("运行 N 牌手机通讯录");
}
}
缺点:
如果新增一个音乐播放功能,就需要在每一个品牌下新增一个子类。
也就是说限制了灵活性。
对象的继承关系是在编译时就定义好了,无法在运行时改变父类继承的实现。
子类与父类有很紧密的关系,父类实现中的任何变化必然会导致子类发生变化。
当需要复用子类时,如果继承的实现不适合解决新的问题,那么父类必须重写。
那怎么办呢?
桥接模式(Bridge):
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
在这个例子中,可以把 手机软件 和 手机品牌 独立出来。
1.手机软件
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("运行手机通讯录");
}
}
2.手机品牌
abstract class HandsetBrand
{
protected HandsetSoft soft;//与手机软件进行桥接
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
public abstract void Run();
}
class HandsetBrandM : HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
class HandsetBrandN : HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
3.如何使用呢?
HandsetBrand handsetBrand;
handsetBrand = new HandsetBrandN();
handsetBrand.SetHandsetSoft(new HandsetGame());
handsetBrand.Run();
handsetBrand.SetHandsetSoft(new HandsetAddressList());
handsetBrand.Run();
handsetBrand = new HandsetBrandM();
handsetBrand.SetHandsetSoft(new HandsetGame());
handsetBrand.Run();
handsetBrand.SetHandsetSoft(new HandsetAddressList());
handsetBrand.Run();
这样的话:
如果新增一个功能,比如:播放器,只需添加一个 HandsetMP3
。
如果新增一个品牌,比如:播放器,只需添加一个 HandsetBrandL
。
也就符合了开放封闭原则。