java 桥接模式_java设计模式之桥接模式

桥接模式

桥接(Bridge Pattern)将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度,这种类型的设计模式属于结构型模式。

桥接模式解决的问题

将抽象部分与实现部分分离,使它们都可以独立的变化。实现系统可能有多个角度分类,每一种角度都可能变化。

桥接模式模式角色

抽象类(Abstraction):抽象类接口,维护队行为实现(implementation)的引用。

抽象扩展(Refined Abstraction):是抽象类的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。

实现化接口(Implementor):定义实现化角色的接口,供扩展抽象化角色调用。

具体实现(Concrete Implementor):给出实现化角色接口的具体实现。

使用场景

如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。

桥接模式和策略模式的区别

桥接模式

策略模式

形式上的不同

两者还是有一定区别的,对比两幅结构图,我们可以发现,在桥接模式中不仅Implementor具有变化 (ConcreateImplementior),而且Abstraction也可以发生变化(RefinedAbstraction),而且两者的变化 是完全独立的,RefinedAbstraction与ConcreateImplementior之间松散耦合,它们仅仅通过Abstraction与 Implementor之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性。

语意上的不同

桥接模式强调Implementor接口仅提供基本操作,而Abstraction则基于这些基本操作定义更高层次的操作。而策略模式强调 Strategy抽象接口的提供的是一种算法,一般是无状态、无数据的,而Context则简单调用这些算法完成其操作。

策略模式,桥接模式要表达的内容要更多,结构也更加复杂。

代码实现

/**

* Implementor

*/

public interface Software {

public void run();

}

/**

* Concrete Implementor

*/

public class Camera implements Software{

@Override

public void run() {

System.out.println("software camera");

}

}

/**

* Concrete Implementor

*/

public class Message implements Software{

@Override

public void run() {

System.out.println("Software message");

}

}

/**

* Abstraction

*/

public abstract class Phone {

private Software software;

public void setSoftware(Software software) {

this.software = software;

}

public Software getSoftware() {

return software;

}

public Phone(Software software) {

this.software = software;

}

public abstract void run();

}

/**

* Concrete Implementor

*/

public class HuaWei extends Phone{

public HuaWei(Software software) {

super(software);

}

@Override

public void run() {

System.out.println("HuaWei run software");

getSoftware().run();

}

}

/**

* Concrete Implementor

*/

public class Iphone extends Phone{

public Iphone(Software software) {

super(software);

}

@Override

public void run() {

System.out.println("iphone run software");

getSoftware().run();

}

}

public class BridgeModeTest {

public static void main(String[] args) {

Software software = new Camera();

Phone phone = new HuaWei(software);

phone.run();

System.out.println("----------------");

software = new Message();

phone = new Iphone(software);

phone.run();

}

}

运行结果:

优缺点

优点:抽象和实现的分离,优秀的扩展能力,实现细节对客户透明。

缺点:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。

生活中的桥接模式

手机有很多不同的app,有购物、社交、音乐、视频、地图等等,每一款app都是一种算法实现,app属于被调用者,手机作为调用者,又分很多种,有iphone、华为、小米、锤子等,这种场景可以使用桥接模式,实现调用者和被调用者分离。

汽车有很多零件,有轮胎、发动机、座椅、方向盘,汽车又分很多品牌,有保时捷、特斯拉、奔驰、宝马等,这种场景也同样适用于桥接模式。

我的启发

策略模式是对算法的抽象,调用者可以根据不同的情况,自主选择不同的算法实现。桥接模式是策略模式的升级版,不仅对算法实现进行抽象,对于调用者也进行抽象,让系统扩性更好,更灵活。世界没有免费的午餐,灵活性变高了,但是复杂性也变高了,对程序员的要求也更高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值