本设计模式系列代码地址:
GitHub - GodisGod/DesignPatternStudy: 设计模式学习demo
https://github.com/GodisGod/DesignPatternStudy
定义:
将抽象部分与实现部分分离,使它们都可以独立的进行变化。
使用场景:
A:抽象部分
B:桥梁
C:实现部分
A----B----C
A可能有多种情况,C也可能有多种情况,但是无论A和C怎么变化,他们之间都需要互不影响。
代码举例:
我们有一个咖啡店,店里有很多种咖啡,分别有大杯小杯,加糖和不加糖的咖啡。
这样我们就有了四种组合:大杯加糖,大杯不加糖,小杯加糖,小杯不加糖。
我们使用桥接模式来实现这个场景
咖啡的包装有:大杯,小杯,以后可能还会扩展出中杯,玻璃杯,纸杯,罐装,瓶装等等
咖啡的佐料有:原味,加糖,加冰,加柠檬,加橘子,加饼干等等(这些是我瞎说的啦O(∩_∩)O哈哈~大家意会就好)
那么咖啡的包装和佐料就会产生非常多的组合,我们要保持整个代码的灵活性和可扩展性,那么使用桥接模式要怎么做呢?
1、首先要定义佐料的抽象类
/**
* 咖啡佐料的抽象类
*/
public abstract class CoffeeAdditives {
/**
* 具体往咖啡里添加的东西由子类实现
*
* @return 具体添加的东西
*/
public abstract String addSomething();
}
2、接着我们提供两种佐料:原味和加糖
/**
* 原味
*/
public class Ordinary extends CoffeeAdditives {
@Override
public String addSomething() {
return "原味";
}
}
/**
* 加糖
*/
public class Sugar extends CoffeeAdditives {
@Override
public String addSomething() {
return "加糖";
}
}
3、接着定义咖啡包装的抽象类:这里最关键的地方在于持有了一个咖啡佐料抽象类的引用!这就是桥接模式的核心之处。第二个关键的地方在于构建抽象方法,具体制作咖啡的流程由子类决定。
/**
* 咖啡包装的抽象类
*/
public abstract class Coffee {
//持有了咖啡佐料“抽象”对象的引用,注意是抽象对象,而不是某个具体的对象
protected CoffeeAdditives coffeeAdditives;
public Coffee(CoffeeAdditives coffeeAdditives) {
this.coffeeAdditives = coffeeAdditives;
}
/**
* 具体什么咖啡由子类决定
*/
public abstract void makeCoffee();
}
4、然后我们提供两种咖啡包装:大杯和小杯
/**
* 大杯咖啡
*/
public class LargeCoffee extends Coffee {
public LargeCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
public void makeCoffee() {
Log.i("LHD", "大杯的" + coffeeAdditives.addSomething() + "咖啡");
}
}
/**
* 小杯咖啡
*/
public class SmallCoffee extends Coffee {
public SmallCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
public void makeCoffee() {
Log.i("LHD", "小杯的" + coffeeAdditives.addSomething() + "咖啡");
}
}
5、好了!接下来就是制作咖啡啦!(^ ▽ ^)
//准备佐料
//原味咖啡
Ordinary ordinary = new Ordinary();
//糖
Sugar sugar = new Sugar();
//准备包装
//大杯咖啡 原味
LargeCoffee largeCoffee = new LargeCoffee(ordinary);
largeCoffee.makeCoffee();
//大杯咖啡 加糖
LargeCoffee largeCoffeeSugar = new LargeCoffee(sugar);
largeCoffeeSugar.makeCoffee();
//小杯咖啡 原味
SmallCoffee smallCoffee = new SmallCoffee(ordinary);
smallCoffee.makeCoffee();
//小杯咖啡 加糖
SmallCoffee smallCoffeeSugar = new SmallCoffee(sugar);
smallCoffeeSugar.makeCoffee();
输出:
如果我们又多了一种包装:中杯,那么我们只需要添加一个中杯实现类即可,如下:
/**
* 中杯
*/
public class MiddleCoffee extends Coffee {
public MiddleCoffee(CoffeeAdditives coffeeAdditives) {
super(coffeeAdditives);
}
@Override
public void makeCoffee() {
Log.i("LHD", "中杯的" + coffeeAdditives.addSomething() + "咖啡");
}
}
制作咖啡:
//中杯咖啡 原味
MiddleCoffee middleCoffee = new MiddleCoffee(ordinary);
middleCoffee.makeCoffee();
//中杯咖啡 加糖
MiddleCoffee middleCoffeeSugar = new MiddleCoffee(sugar);
middleCoffeeSugar.makeCoffee();
输出:
这就是桥接模式啦!可见其把抽象部分和具体的实现部分做了分离,不管抽象部分(咖啡的包装)怎么变化或者实现部分(咖啡的佐料)怎么变化都不会影响彼此。
其核心的地方就在于抽象部分的抽象类持有了实现部分的抽象类的引用。并把具体实现交给子类处理。
以上就是桥接模式的简单介绍啦! (#^ . ^#)
到这里,我的学习模式总结系列就告一段落啦,还有很多没有介绍到的设计模式,但由于并非常用的设计模式就不再介绍。学习主要参考资料是何红辉、关爱民二位老师的《Android 源码设计模式》并加入了一些我自己的理解,这本书里面不仅介绍了设计模式的基本理念,更从Android源码的角度对设计模式的实际使用进行了详细的讲解,如果大家仍然有什么疑惑,不妨读读这本书,真的是非常好。
设计模式的框架理念比较容易理解,难在实际项目中的灵活运用,希望自己也希望各位一同学习的小伙伴都能在自己的项目里把设计模式发扬光大,让我们的代码越来越优秀。
谢谢大家的支持!
终于结束咯!晚饭加个蛋哈哈 (^ ▽ ^)