目录
一:桥接模式
1.问题引出
现在有这么一个类叫做手机品牌,其中有这么些属性:手机品牌名称,通讯录,游戏等。那么他创建的对象就如下图所示:
如上图所示,创建了多个对象 每一个对象都至少包含着3个属性,那么有这样问题产生了:如果新出的一个手机品牌没有游戏呢?如果新出的一个手机品牌还有音乐软件呢?前者实现可能简单,但是后者就需要在代码运行时做动态修改了。
如果我们将问题分解一下,这个手机品牌拆解成手机品牌和手机软件。也就是说通讯录,游戏包含后面的音乐等都被抽象成一个手机软件了。如下图:
2.引出概念
我们还是看上面的第一幅图:在第一幅图中,每一个层次的关系都是以继承来实现。再来看第二幅图:手机品牌把继承关系改成了包含关系。这种就很符合了java开发设计中的“开-闭”原则,尽量把继承关系改成聚合/合成原则。关于聚合和合成大家可以自行的百度。
官方对于桥接模式的定义为:“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。这其中包含了三个关键词:抽象化,实现化,解耦。
抽象化:把共同的特性抽象脱离出来。就比如上图中把通讯录,游戏等抽象成手机软件。
实现化:对于抽象化的实现。就如上图通讯录,游戏,音乐等等就是对手机软件的实现。
解耦:将强关系改成弱关系。就比如上图手机品牌和耍手机软件就变成了一个弱关系了,就是说手机品牌可以包含手机软件也
可以不包含,而不像第一幅图设计一样一定被包含进去了(不管是不是为null)。
二:代码讲解
1.手机品牌的抽象以及实现
package test.com;
/**
* 手机品牌的抽象
* @author monxz
*
* @time 2019年7月18日
*/
public abstract class PhoneBrand {
public abstract void phoneBrandName();
}
package test.com;
/**
* 手机品牌的抽象实现
* @author monxz
*
* @time 2019年7月18日
*/
public class PhoneBrandImpl extends PhoneBrand{
@Override
public void phoneBrandName() {
System.err.println("手机品牌:三星手机");
}
}
package test.com;
/**
* 手机品牌的抽象实现
* @author monxz
*
* @time 2019年7月18日
*/
public class PhoneBrandImpl2 extends PhoneBrand{
@Override
public void phoneBrandName() {
System.err.println("手机品牌:苹果手机");
}
}
2.手机软件的抽象和实现
package test.com;
public abstract class sofeWare {
public abstract void sofeWare();
}
package test.com;
/**
* 手机软件的抽象实现
* @author monxz
*
* @time 2019年7月18日
*/
public class sofeWareImpl extends sofeWare{
@Override
public void sofeWare() {
System.err.println("手机软件qq");
}
}
package test.com;
/**
* 手机软件的抽象实现
* @author monxz
*
* @time 2019年7月18日
*/
public class sofeWareImpl2 extends sofeWare{
@Override
public void sofeWare() {
System.err.println("手机软件微信");
}
}
3.聚合
package test.com;
public class Phone {
private PhoneBrand phoneBrand;
private sofeWare sofeWare;
public PhoneBrand getPhoneBrand() {
return phoneBrand;
}
public void setPhoneBrand(PhoneBrand phoneBrand) {
this.phoneBrand = phoneBrand;
}
public sofeWare getSofeWare() {
return sofeWare;
}
public void setSofeWare(sofeWare sofeWare) {
this.sofeWare = sofeWare;
}
public void phoneBrandName() {
phoneBrand.phoneBrandName();
}
public void sofeWare() {
sofeWare.sofeWare();
}
}
4.测试
package test.com;
public class test {
public static void main(String[] args) {
Phone phone=new Phone();
phone.setPhoneBrand(new PhoneBrandImpl());
phone.setSofeWare(new sofeWareImpl());
phone.phoneBrandName();
phone.sofeWare();
}
}
三:说明
桥接模式是java中直接运用的比较少的模式,但是他透露出了java的特性,可以很好的理解java的设计与开发。