一、认识桥接模式
1、概念
将抽象部分与它实现部分分离,使它们都可以独立地变化。
2、例子说明
从上面的例子我们可以看到,我们的手机可以从两个维度进行变化,一个是品牌,一个是内存。此时我们就可以通过桥接模式将这两个维度分离开来,每一个维度都可以独立扩展。比如说手机品牌,可以又出现了苹果、三星、锤子等等。内存方面又可以生产10G、16G的了。从专业的角度来看可以这样定义桥接模式:
“桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”
3、类图
基本上意思就是这,也就是我们买手机的时候有两个维度可供我们选择:一个是品牌一个是内存。
(1)client:指的是我们买手机的人。
(2)Abstraction(抽象类):指的是手机抽象类
(3)Refined Abstraction(具体类):指的是具体手机品牌
(4)Implementor:在这里相当于手机的其他组件,内存
(5)ConcreteImplementor:具体的内存型号。
二、实现桥接模式
1.内存部分
public interface Memary {
void showMeray();
}
public class MemaryFive implements Memary{
@Override
public void showMeray() {
System.out.println("---five Memary---");
}
}
public class MemaryTweleven implements Memary{
@Override
public void showMeray() {
System.out.println("Memary 12");
}
}
2.手机部分
public abstract class AbstructPhone {
public Memary memary;
public AbstructPhone(Memary memary) {
super();
this.memary = memary;
}
abstract void showPhone();
}
public class ApplePhone extends AbstructPhone{
public ApplePhone(Memary memary) {
super(memary);
}
@Override
void showPhone() {
this.memary.showMeray();
System.out.println("show ApplePhone");
}
}
public class MiPhone extends AbstructPhone{
public MiPhone(Memary memary) {
super(memary);
}
@Override
void showPhone() {
this.memary.showMeray();
System.out.println("show MiPhone");
}
}
3.测试
public class Tests {
public static void main(String[] args) {
AbstructPhone phone = new MiPhone(new MemaryFive());
phone.showPhone();
}
}
三、分析桥接模式
1、为什么使用桥接模式不使用继承呢?
继承是一种强耦合关系,子类与父类有非常紧密的依赖关系,父类的任何变化 都会导致子类发生变化。因此才使用桥接模式,使用了桥接模式之后,我们的两个维度就像桥梁一样被链接了起来。体现了松耦合的特性。
2、桥接模式的优点
(1)分离抽象和实现部分:把手机、内存抽象出来。实现与之分离。
(2)松耦合:两个维度分开
(3)单一职责原则:每个维度各干各的活