您的位置:首页 > 编程语言 > Java开发

设计模式实例学习-桥接模式

2015-11-18 22:06 633 查看

设计模式实例学习-桥接模式

原创博客,转载请注明出处:

http://blog.csdn.net/u011035622/article/details/49913793

定义

概念定义

(行为模式)

将抽象于实现解耦,使二者可以独立的变化。
我的理解:所需要实现的对象不通过直接在场景类中操作它的行为(方法),为了将它的行为状态抽象分离,因而通过抽象化角色中保存有对实现对象角色的引用,将实现对象的行为(方法)放在这抽象化角色的方法中调用。(有点绕口。。)


角色职责

抽象化角色

具体抽象化角色

内部保存对实现化角色的引用,负责控制实现化角色的行为和状态。


实现化角色

具体实现化角色

实现化,顾名思义,被实现的对象,定义自身的方法属性。


实例分析

场景描述

电台需要插播广告,不同广告的广告词和广告代言人都不一样,需要根据情况调整,另外不同电台对广告的播放上也可能有不同要求。


代码讲解及分析

抽象化角色 TvBoss.java

public abstract class TvBoss {
Advertisement mAdvertisement;

public void setAdvertisement(Advertisement _advertisement){
this.mAdvertisement = _advertisement;
}

public void reportAd(){
mAdvertisement.AdWords();
mAdvertisement.AdPerson();;
}

}


  通过reportAd()方法来操作实现化角色的行为(方法)。

具体抽象化角色

  YyTvBoss.java:YY电台公司老大

public class YyTvBoss extends TvBoss{

@Override
public void reportAd() {
super.reportAd();
System.out.println("YY公司,这里增添或修改对象的行为。");
}
}


实现化角色 Advertisement.java

public interface Advertisement {
//广告词
void AdWords();
//广告时间
void AdPerson();
}


具体实现化角色

 MusicAd.java:音乐广告

public class MusicAd implements Advertisement{

@Override
public void AdWords() {
System.out.println("播放音乐广告词。");
}

@Override
public void AdPerson() {
System.out.println("周杰伦代言");
}

}


  ColaAd.java:可乐饮料广告

public class ColaAd implements Advertisement{

@Override
public void AdWords() {
System.out.println("播放可乐广告词");
}

@Override
public void AdPerson() {
System.out.println("科比代言");

}

}


场景类:

package bridge;

public class Main {

public static void main(String[] args) {
TvBoss boss = new YyTvBoss();
boss.setAdvertisement(new ColaAd());
boss.reportAd();

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

boss.setAdvertisement(new MusicAd());
boss.reportAd();
}

}


输出:

播放可乐广告词
科比代言
YY公司,这里增添或修改对象的行为。
--------------------
播放音乐广告词。
周杰伦代言
YY公司,这里增添或修改对象的行为。


分析:

  由图中例子可以看出,通过桥接模式将Boss调用广告播放操作和广告本身分开。这样对于新进的广告,我们只需要增加一个广告类,调用者及操作行为都无需改变。

桥接模式优缺点

优点

抽象与实现分离

拓展方便,减少了继承(重复用抽象化角色修饰进行拓展)。

实现化角色行为封装在抽象化角色中,客户无需了解细节。

缺点

很明显的是,父类中有的方法,子类必须也要有。对于同一个具体抽象化角色引用的具体实现化角色,不同的具体实现化角色调用相同的方法,如果增加不同类型的实现化角色,则可能需要再继承一个抽象化角色来引用它。这样的情况多了就会导致产生很多的抽象化角色。当然这也是为了替代继承————这对应的说明了桥接模式是能够很好的将公共方法和公共属性抽取,封装。

应用场景

替代继承的需要(最明显的特点)

重用性比较高的场景

接口或抽象类不稳定的场景(根据业务需求判断)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息