白话-23种设计模式10-桥接模式
【摘要】 一、白话 假设我是手机订购甲方,由于我是甲方爸爸,我现在对现有的几款手机并不是很满足,我希望他们能各自添加一些特殊的功能,可能会重复,也有可能不会。小米,华为,苹果。我希望小米可以唱歌,华为可以画画,苹果可以跳舞。然后各自的厂商就去在原先的的功能上添加了新的功能,交给我。我看了后,感觉又后悔了,我想不行,我华为可以唱歌,小米可以画画。然后他们又回去改,在原先的功能上添加功能,然后我又。。(...
一、白话
假设我是手机订购甲方,由于我是甲方爸爸,我现在对现有的几款手机并不是很满足,我希望他们能各自添加一些特殊的功能,可能会重复,也有可能不会。小米,华为,苹果。我希望小米可以唱歌,华为可以画画,苹果可以跳舞。然后各自的厂商就去在原先的的功能上添加了新的功能,交给我。我看了后,感觉又后悔了,我想不行,我华为可以唱歌,小米可以画画。然后他们又回去改,在原先的功能上添加功能,然后我又。。(像不像客户经理,啥都不懂,要求贼多)。那这样下去,三家工厂肯定不干呀,但是我又是甲方爸爸,他们只能改。于是他们想了一个办法,成立了一个桥接工作室,只要是工作室成员的手机,无论谁来,都能完美加上相应的功能,这样,只要是功能限定在画画,唱歌,跳舞,我都可以随便换,想好了告诉他们就行。
将手机和功能拆分开,并使用桥接手段连接起来,就是桥接模式,多维度的一个桥接使用。
其中:各自的厂商各自添加新的功能,就类似于继承手段,添加新功能,但是随着换来换去,组合增多,就出现了类爆炸。后面统一桥接工作室,就是桥接模式,就是利用多态的特性实现多组合排列的特性。
二、定义
将一个继承关系变为组合关系。
- 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
- 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
- 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
- 具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现。
三、示例
// 抽象角色-统一手机
public abstract class Phone {
public abstract void show();
}
// 修正抽象角色-具体手机
public class HuaWei extends Phone {
@Override
public void show() {
System.out.println("华为手机展示功能==");
}
}
// 修正抽象角色-具体手机
public class XiaoMi extends Phone {
@Override
public void show() {
System.out.println("小米手机展示功能==");
}
}
// 实现化角色-给出接口,不给具体实现
public abstract class Expansion {
// 桥接-使用组合代替继承方式
private Phone phone;
public void setPhone(Phone phone) {
this.phone = phone;
}
public Phone getPhone() {
return this.phone;
}
// 新功能
public abstract void addSomething();
}
// 具体抽象角色-具体实现接口
public class Sing extends Expansion {
@Override
public void addSomething() {
getPhone().show();
System.out.println("添加了新功能【唱歌】==");
}
}
// 具体抽象角色-具体实现接口
public class Dance extends Expansion {
@Override
public void addSomething() {
getPhone().show();
System.out.println("添加了新功能【跳舞】==");
}
}
public class BridgeApplication {
// 客户端调用
public static void main(String[] args) {
// 获取具体实现
Expansion sing = new Sing();
Expansion dance = new Dance();
// 桥接对象
sing.setPhone(new HuaWei());
dance.setPhone(new HuaWei());
sing.addSomething();
dance.addSomething();
sing.setPhone(new XiaoMi());
dance.setPhone(new XiaoMi());
sing.addSomething();
dance.addSomething();
}
}
输出结果展示:
华为手机展示功能==
添加了新功能【唱歌】==
华为手机展示功能==
添加了新功能【跳舞】==
小米手机展示功能==
添加了新功能【唱歌】==
小米手机展示功能==
添加了新功能【跳舞】==
华为和小米都能和需求任意组合,无论怎么换都可以了。
四、总结
优点:使用组合代替继承。降低了耦合性。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)