代理模式四:桥接模式
简介
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。
- 官方介绍
(1):如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
(2):“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
(3):一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
(4):对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
案列: 1.咖啡: 咖啡有很多种添加剂,如:糖,牛奶,2.咖啡有很多种杯的尺寸,如:大杯,小杯,现需求,咖啡尺寸定了,但是添加剂不定,这时就需要桥接模式,首先确定咖啡尺寸实现类,然后往咖啡尺寸实现类中添加不同的添加剂实现类,这就可以实现了。
代码
- 咖啡添加剂接口,添加添加剂抽象方法
public interface ICoffeeAdditives {
void addSomething();
}
- 咖啡添加剂实现类1
public class Milk implements ICoffeeAdditives {
@Override
public void addSomething() {
System.out.println("加奶");
}
}
- 咖啡添加剂实现类2
public class Sugar implements ICoffeeAdditives {
@Override
public void addSomething() {
System.out.println("加糖");
}
}
- 顶级抽象类接口,添加咖啡尺寸抽象方法,以及添加剂抽象接口实现类对象
public abstract class Coffee {
//咖啡添加剂接口
protected ICoffeeAdditives additives;
public Coffee(ICoffeeAdditives additives){
this.additives=additives;
}
/**
* @Description: 预定咖啡接口
* @Author: zhuyang
* @Date: 2021-08-18
* @Param:
* @return:
**/
public abstract void orderCoffee(int count);
}
- 修正类接口,此接口存在意义,就是添加了一个额外的方法而已,多了一个功能
public abstract class RefindedCoffee extends Coffee {
public RefindedCoffee(ICoffeeAdditives additives) {
super(additives);
}
public void checkQuality(){
Random random=new Random();
System.out.println(String.format("%s 添加 %s",additives.getClass().getSimpleName(),random.nextBoolean()?"太多":"正常"));
}
}
- 咖啡尺寸实现类1
public class LargeCoffee extends RefindedCoffee {
public LargeCoffee(ICoffeeAdditives additives){
super(additives);
}
@Override
public void orderCoffee(int count) {
//咖啡添加剂
additives.addSomething();
//预定咖啡
System.out.println(String.format("预定%s杯大杯咖啡",count));
}
}
- 咖啡尺寸实现类2
public class SmallCoffee extends RefindedCoffee {
public SmallCoffee(ICoffeeAdditives additives) {
super(additives);
}
@Override
public void orderCoffee(int count) {
additives.addSomething();
System.out.println(String.format("预定%s杯小杯咖啡",count));
}
}
- 测试
public class BridgeTest {
public static void main(String[] args) {
//确定添加剂
ICoffeeAdditives additives=new Milk();
//制作咖啡
RefindedCoffee coffee=new LargeCoffee(additives);
//调用方法制作咖啡
coffee.orderCoffee(2);
coffee.checkQuality();
}
}
总结
此桥接模式在某些特定情况下可以使用,但是使用频率不高
Gitee地址
https://gitee.com/zhuayng/foundation-study.git
参考
XFS