设计模式(七):桥接模式Bridge(结构型模式)

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

一. 适用性

1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。

2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

4.(C++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的
有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。Rumbaugh 称这种类层次结构为“嵌套的普化”(nested generalizations )。

5.你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。一个简单的例子便是Coplien 的String 类[ C o p 9 2 ],在这个类中多个对象可以共享同一个字符串表示(S t r i n g R e p )。

二.参与者

1.Abstraction
定义抽象类的接口。
维护一个指向Implementor类型对象的指针。

2.RefinedAbstraction
扩充由Abstraction定义的接口。

3.Implementor
定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。
事实上这两个接口可以完全不同。
一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。

4.ConcreteImplementor
实现Implementor接口并定义它的具体实现。

三.实例

package com.zoey.designPattern.Bridge;

public abstract class WardrobeMaker {
    abstract public  void produce();
}
package com.zoey.designPattern.Bridge;

/*
 * 衣柜
 */
public abstract class Wardrobe {
    //衣柜厂商
    protected WardrobeMaker wardrobeMaker;
    //放置衣物
    abstract public void placeClothing(WardrobeMaker wardrobeMaker);
}
package com.zoey.designPattern.Bridge;

public class BigMaker extends WardrobeMaker {

    public BigMaker(){
        System.out.println("big厂商");
    }

    @Override
    public void produce() {
        System.out.println("big厂商");
    }

}
package com.zoey.designPattern.Bridge;

public class BigWardrobe extends Wardrobe {

    @Override
    public void placeClothing(WardrobeMaker wardrobeMaker) {
        System.out.println("一个big衣柜");
    }

}
package com.zoey.designPattern.Bridge;

public class SmallMarker extends WardrobeMaker {

    public SmallMarker(){
        System.out.println("small厂商");
    }

    @Override
    public void produce() {
        System.out.println("small厂商");
    }

}
package com.zoey.designPattern.Bridge;

public class SmallWardrobe extends Wardrobe {

    @Override
    public void placeClothing(WardrobeMaker wardrobeMaker) {
        System.out.println("一个small衣柜");
    }

}
package com.zoey.designPattern.Bridge;

public class Test {

    public static void main(String[] args) {
        BigWardrobe bw = new BigWardrobe();
        bw.placeClothing(new BigMaker());

        SmallWardrobe sw = new SmallWardrobe();
        sw.placeClothing(new SmallMarker());
    }

}

结果:

big厂商
一个big衣柜
small厂商
一个small衣柜

形象比喻:摘自网络

BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了
  桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值