定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。既实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。抽象与它的实现分离,并不是让抽象类与其派生类分离,实现
指的是抽象类和它的派生类用来实现自己的对象。
优势:在继承体系中有多个方向变化时,可以解耦这些不同的方向变化。具体的理解为,例如下面带例子的桥接模式:手机品牌这个抽象父类就是一个桥,用于链接不同品牌下手机软件的适应变化。
适用:1.具体的功能实现需要被独立出来,让它们各自变化,且每种实现的变化不会影响其他实现的但又要有统一管理的情况;
2.不希望在抽象与实现部分之间有固定的绑定关系;
3.类的抽象以及它的实现都应该通过生成子类的方式加以扩充。这时桥接模式可以对不同的抽象接口和实现部分进行组合,并分别对它们实现;
4.对抽象的实现部分进行修改应对客户不产生影响,即客户的代码不必重新编译;
5.相对客户完全隐藏抽象的实现部分;
6.现在多个对象间共享实现,但同时要求客户并不知道这点。游戏中适用的场景例如不同门派、角色与武器之间的调用关系。
特点:1.分离接口及其实现部分,一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现;
2.将Abstraction与Implementor分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译Abstraction类和Client类。为了保证一个类库的不同版本之间的兼容,需要有这个特性;
3.接口和实现分离有助于分层,从而产生更好的结构化系统。系统的高层不封仅需要知道Abstraction和Implementor即可;
4.提高可扩充性,可以独立的对Abstraction与Implementor层次结构进行扩充;
5.实现细节对Client透明。可以对Client隐藏实现细节,如共享Implementor对象以及相应的应用计数机制。
class Program
{
static void Main(string[] args)
{
//Abstraction ab = new RefinedAbstraction(); //没有例子的桥接模式 //执行步骤:1.将继承于Abstraction的对象RefinedAbstraction实例化给ab;
//ab.SetImplementor(new ConcreteImplementorA()); // 2.在ab中调用RefinedAbstraction中类的SetImplementor方法,将ConcreteImplementorA传递到该类中的implementor上;
//ab.Operation(); // 3.在ab中调用RefinedAbstraction中类的Operation方法,由于该方法中的implementor变为了ConcreteImplementorA,故
//ab.SetImplementor(new ConcreteImplementorB()); // 执行的是ConcreteImplementorA中的Operation方法,然后得到ConcreteImplementorA中Operation方法显示的结果;
//ab.Operation(); // 4.重复2、3步骤得到ConcreteImplementorB中Operation方法显示的结果;
//Console.Read();
HandsetBrand hb;
hb = new HandsetBrandN(); //带例子的桥接模式 //执行步骤:基本和上面的一样,这里就不赘述了!
hb.SetHandsetSoft(new HandsetAddressList());
hb.Run(); //总结起来就是:利用抽象父类中HandsetBrand的SetHandsetSoft方法将外部引入的值(例如“new HandsetAddressList()”)附到本类,
hb.SetHandsetSoft(new HandsetGame()); // 然后利用本类中调用的Run方法中本身就是调用HandsetSoft中的Run方法的过程实现一个桥接调用,原理不难,理清楚!
hb.Run();
hb = new HandsetbranM();
hb.SetHandsetSoft(new HandsetGame());
hb.Run();
hb.SetHandsetSoft(new HandsetAddressList());
hb.Run();
Console.Read();
}
}
class Abstraction
{
protected Implementor implementor;
public void SetImplementor(Implementor implementor)
{
this.implementor = implementor;
}
public virtual void Operation()
{
implementor.Operation();
}
}
class RefinedAbstraction:Abstraction
{
public override void Operation()
{
implementor.Operation();
}
}
abstract class Implementor
{
public abstract void Operation();
}
class ConcreteImplementorA : Implementor
{
public override void Operation()
{
Console.WriteLine("毛毛都的无聊生活的具体实现A的方法执行");
}
}
class ConcreteImplementorB : Implementor
{
public override void Operation()
{
Console.WriteLine("毛毛都的无聊生活的具体实现B的方法执行");
}
}
abstract class HandsetBrand
{
protected HandsetSoft soft;
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
abstract public void Run();
}
class HandsetBrandN : HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
class HandsetbranM : HandsetBrand
{
public override void Run()
{
soft.Run();
}
}
abstract class HandsetSoft
{
public abstract void Run();
}
class HandsetGame : HandsetSoft
{
public override void Run()
{
Console.WriteLine("Run handset game!");
}
}
class HandsetAddressList : HandsetSoft
{
public override void Run()
{
Console.WriteLine("Run handset address list!");
}
}
转载请注明出处!!!
欢迎加入951815219群聊,共享知识,讨论交流~