前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java设计模式之桥接模式,策略模式旗舰版,世界没有免费的午餐

java设计模式之桥接模式,策略模式旗舰版,世界没有免费的午餐

作者头像
用户4361942
发布2019-05-24 16:58:58
8760
发布2019-05-24 16:58:58
举报
文章被收录于专栏:java程序员思维

桥接模式

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

桥接模式解决的问题

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

桥接模式模式角色

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

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

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

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

使用场景

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

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

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

桥接模式

策略模式

形式上的不同

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

语意上的不同

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

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

代码实现

代码语言:javascript
复制
/**
 * Implementor
 */
public interface Software {
 public void run();
}
代码语言:javascript
复制
/**
 * Concrete Implementor
 */
public class Camera implements Software{
 @Override
 public void run() {
 System.out.println("software camera");
 }
}
代码语言:javascript
复制
/**
 * Concrete Implementor
 */
public class Message implements Software{
 @Override
 public void run() {
 System.out.println("Software message");
 }
}
代码语言:javascript
复制
/**
 * 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();
}
代码语言:javascript
复制
/**
 * 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();
 }
}
代码语言:javascript
复制
/**
 * 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();
 }
}
代码语言:javascript
复制
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、华为、小米、锤子等,这种场景可以使用桥接模式,实现调用者和被调用者分离。

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

我的启发

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java程序员思维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档