桥模式
2020-10-20
- 模式定义:将抽象与实现分离,使它们都可以独立地变化。
- 应用场景:两个非常强的变化维度。
案例 #
-
分析一下,首先会创建1个电脑类,然后创建3个电脑的子类(即电脑的类型),再创建3x3个子类。假设有n种电脑类型,m种电脑品牌,那么产生的类的数量为1+n+nxm。
-
如果再加一个电脑品牌acer,则需要再添加三个类,即acer台式机、acer笔记本、acer平板。显然这种方式产生的类的数量非常多。
-
此外,这个实现违背了单一职责原则,类中出现了两个变化(电脑类型和品牌)。
-
解决办法:将类型写成一个抽象类,将品牌写成一个抽象类。通过一个"桥"将他们联系起来。
//品牌类
interface Brand{
void info();
}
class Lenovo implements Brand{
public void info(){
//...
}
}
class Apple implements Brand{
public void info(){
//...
}
}
class Dell implements Brand{
public void info(){
//...
}
}
//电脑类
abstract class Computer{
//通过类组合来替代类继承
protected Brand brand;
public Computer(Brand brand){this.brand=brand;}
abstract void info();
}
class Desktop extends Computer{
public Desktop(Brand brand){super(brand);}
public void info(){
//...
}
}
class Laptop extends Computer{
public Laptop(Brand brand){super(brand);}
public void info(){
//...
}
}
class Pad extends Computer{
public Pad(Brand brand){super(brand);}
public void info(){
//...
}
}
- 通过上面的修改,类的数量变成了1+n+m。
- 在这里我理解的抽象是Brand,实现指的是Computer和Computer的子类。