桥接模式定义
桥接模式(Bridge Pattern),也叫做桥梁模式,结构型设计模式的一种,这个模式相对来说有些难理解。桥接,顾名思义,就是用来连接两个部分,为被分离了的抽象部分和实现部分搭桥。
主要作用将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度
桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。
桥接模式包含以下角色:
桥接模式优缺点:
优点:
缺点:
使用场景
(1)如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
(2)抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
(3)一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
(4)虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
(5)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
以下举一个桥接模式的例子:
将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变
人在吃水果,这里有两个维度的变化,人有不同的人,水果也也有多种
person类(实现化角色):
/**
* person类(实现化角色)
*/
public interface Person {
public void eat();
}
具体的person:小明(具体实现化角色)
/**
* 具体的person:小明(具体实现化角色)
*/
public class xiaoMing implements Person {
@Override
public void eat() {
System.out.println("小明在吃");
}
}
具体的person:小李(具体实现化角色)
/**
* 具体的person:小李(具体实现化角色)
*/
public class xiaoLi implements Person {
@Override
public void eat() {
System.out.println("小李在吃");
}
}
抽象的水果类(抽象化角色):
/**
* 抽象的水果(抽象化角色)
*/
public abstract class Fruit {
protected Person person;
protected Fruit(Person person){
this.person = person;
}
public abstract void personEatFruit();
}
具体的水果:苹果(具体实现化角色)
/**
* 具体的水果:苹果(具体实现化角色)
*/
public class apple extends Fruit{
public apple(Person person) {
super(person);
}
@Override
public void personEatFruit() {
super.person.eat();
System.out.println("苹果");
}
}
具体的水果:梨(具体实现化角色)
/**
* 具体的水果:梨(具体实现化角色)
*/
public class pear extends Fruit{
public pear(Person person) {
super(person);
}
@Override
public void personEatFruit() {
super.person.eat();
System.out.println("梨");
}
}
测试类:
/**
* 测试类
*/
public class teat {
public static void main(String[] args) {
Fruit appleXiaoMing = new apple(new xiaoMing());
appleXiaoMing.personEatFruit();
Fruit pearXiaoMing = new pear(new xiaoMing());
pearXiaoMing.personEatFruit();
Fruit appleXiaoLi = new apple(new xiaoLi());
appleXiaoLi.personEatFruit();
Fruit pearXiaoLi = new pear(new xiaoLi());
pearXiaoLi.personEatFruit();
}
}
输出结果如下所示:
小明在吃
苹果
小明在吃
梨
小李在吃
苹果
小李在吃
梨
从结果可以看出实现了扩展抽象类与具体实现类的组合,如果增加吃其他水果类型,那就新建个类型继承Fruit类就可以了。
总而言之:
以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git