2017.01.06 学习日记-桥接模式
2017-01-06 21:47
120 查看
这两天忙着考试都没来得及更新。。(懒的借口吧~~~)今天学习的是桥接模式~~
桥接模式(Bridge Pattern)
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
意图:
将抽象部分与实现部分分离,使它们都可以独立的变化。
角色:
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
类图:
实例代码(大话设计模式手机品牌与软件一例):
abstract class HandsetSoft
{
public abstract void Run();
}
abstract class HandsetBrand
{
protected HandsetSoft soft;
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
public abstract void Run();
}
class HandsetGame : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机游戏-----");
}
}
class HandsetAddressList : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机通讯录-------");
}
}
class HandsetMP3 : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行MP3播放器------");
}
}
class HandsetBrandM : HandsetBrand
{
public override void Run()
{
Console.WriteLine("在手机品牌M上");
soft.Run();
}
}
class HandsetBrandN : HandsetBrand
{
public override void Run()
{
Console.WriteLine("在手机品牌N上");
soft.Run();
}
}
class Program
{
static void Main(string[] args)
{
HandsetBrand hb = new HandsetBrandM();
hb.SetHandsetSoft(new HandsetGame());
hb.Run();
hb=new HandsetBrandN();
hb.SetHandsetSoft(new HandsetAddressList());
hb.Run();
hb.SetHandsetSoft(new HandsetMP3());
hb.Run();
Console.ReadKey();
}
}
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
桥接模式(Bridge Pattern)
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
意图:
将抽象部分与实现部分分离,使它们都可以独立的变化。
角色:
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
类图:
实例代码(大话设计模式手机品牌与软件一例):
abstract class HandsetSoft
{
public abstract void Run();
}
abstract class HandsetBrand
{
protected HandsetSoft soft;
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
public abstract void Run();
}
class HandsetGame : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机游戏-----");
}
}
class HandsetAddressList : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机通讯录-------");
}
}
class HandsetMP3 : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行MP3播放器------");
}
}
class HandsetBrandM : HandsetBrand
{
public override void Run()
{
Console.WriteLine("在手机品牌M上");
soft.Run();
}
}
class HandsetBrandN : HandsetBrand
{
public override void Run()
{
Console.WriteLine("在手机品牌N上");
soft.Run();
}
}
class Program
{
static void Main(string[] args)
{
HandsetBrand hb = new HandsetBrandM();
hb.SetHandsetSoft(new HandsetGame());
hb.Run();
hb=new HandsetBrandN();
hb.SetHandsetSoft(new HandsetAddressList());
hb.Run();
hb.SetHandsetSoft(new HandsetMP3());
hb.Run();
Console.ReadKey();
}
}
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
相关文章推荐
- 学习日记之桥接模式和多重继承
- 设计模式学习(八)桥接模式-组合模式-装饰模式
- C#面向对象设计模式纵横谈 学习笔记8 Bridge桥接(结构型模式)
- 设计模式学习-Bridge(桥接)
- JAVA基础第六天学习日记_static关键字、文档、静态代码块、单例开发模式
- 设计模式入门学习 桥接Bridge模式
- 设计模式学习笔记(八)——Bridge桥接模式
- 设计模式学习笔记-桥接模式
- 设计模式学习笔记——桥接(Bridge)模式
- HeadFirst 设计模式学习笔记20--桥接(Bridge)模式拾零
- 设计模式学习笔记-桥接模式
- 设计模式学习笔记十四:适配器模式、桥接模式与外观模式
- C#面向对象设计模式学习笔记(7) - Bridge 桥接模式(结构型模式)
- 设计模式学习笔记--Bridge桥接模式
- java 设计模式 学习笔记(17) 桥接模式
- 设计模式学习笔记(八)——Bridge桥接模式
- 设计模式学习笔记之桥接模式
- 设计模式学习笔记(八)——Bridge桥接模式
- “设计模式”学习之五:桥接、外观、享元与代理(结构型)
- 设计模式学习总结-桥接模式(Bridge Pattern)