设计模式之桥接模式
什么是桥接模式
核心要点:
处理多层继承结构,处理多维度变化的场景,将各个维度设置成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
桥接模式可以用来取代多层继承的方案,多层继承违背单一职责原则,复用性较差,类的个数也非常多,桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
极大的提高了系统的可扩展性,在两个维度中任意扩展一个维度,都不需要修改原有的系统,否和开闭原则。
我们以电脑为例,当我们需要增加新的类型时会同时会增加新的不同品牌的类。违反了单一原则。
public interface Computer {
void sale();
}
class Desktop implements Computer {
@Override
public void sale() {
System.out.println("销售台式机");
}
}
class Laptop implements Computer {
@Override
public void sale() {
System.out.println("销售笔记本");
}
}
class Pad implements Computer {
@Override
public void sale() {
System.out.println("销售平板");
}
}
class HpPad extends Pad {
@Override
public void sale() {
System.out.println("销售Hppad");
}
}
class lenovoPad extends Pad {
@Override
public void sale() {
System.out.println("销售lenovoPad");
}
}
class DellPad extends Pad {
@Override
public void sale() {
System.out.println("销售Dellpad");
}
}
class HpDesktop extends Desktop {
@Override
public void sale() {
System.out.println("销售HpDesktop");
}
}
class lenovoDesktop extends Desktop {
@Override
public void sale() {
System.out.println("销售lenovoDesktop");
}
}
class DellDesktop extends Desktop {
@Override
public void sale() {
System.out.println("销售DellDesktop");
}
}
class HpLatop extends Laptop {
@Override
public void sale() {
System.out.println("销售HpLaptop");
}
}
class lenovoLaptop extends Laptop {
@Override
public void sale() {
System.out.println("销售lenovoLaptop");
}
}
class DellLaptop extends Laptop {
@Override
public void sale() {
System.out.println("销售DellLaptop");
}
}
怎么使用桥接模式
我们将电脑分为两个维度,一个是电脑类型,一个是电脑品牌,将两个维度分别设置两个类,通过桥接将两个维度链接。
/**
* 品牌的接口
*/
public interface Brind {
void sale();
}
class Leveno implements Brind{
@Override
public void sale() {
System.out.println("销售联想");
}
}
class Hp implements Brind{
@Override
public void sale() {
System.out.println("销售惠普");
}
}
class Dell implements Brind{
@Override
public void sale() {
System.out.println("销售戴尔");
}
}
通过Computer2类桥接两个维度。
public class Computer2 {
protected Brind brind;
public Computer2(Brind brind) {
super();
this.brind = brind;
}
public void sale() {
System.out.println("销售电脑");
}
}
class Desktop2 extends Computer2{
public Desktop2(Brind brind) {
super(brind);
}
@Override
public void sale() {
super.sale();
System.out.println("销售台式");
}
}
class Laptop2 extends Computer2{
public Laptop2(Brind brind) {
super(brind);
}
@Override
public void sale() {
super.sale();
System.out.println("销售笔记本");
}
}
class Pad2 extends Computer2{
public Pad2(Brind brind) {
super(brind);
}
@Override
public void sale() {
super.sale();
System.out.println("销售pad");
}
}
什么时候用桥接模式
- JDBC驱动程序
- AWT中的peer架构
银行日志管理:
- 格式分类:操作日志,交易日志,异常日志。
- 距离分类:本地记录日志,记录日志。
OA系统中的消息处理:
- 业务类型:普通消息,加急消息,特急消息。
- 发送方式:系统内消息,邮件,手机短信。
人力资源系统中的资金计算模块:
- 奖金类型:个人奖金,团队奖金,激励奖金。
- 部门类型:人事部门,销售部门,研发部门。