java设计模式之桥梁模式(Bridge)
1.桥梁模式 与 策略模式 非常相似
(其实很多设计模式都相似,因为所有的模式都是按照设计原则 而设计出来的,设计原则就相当于武功的心法,设计模式就是招式,只要心法过硬,就可以无招胜有招了。)
这里也有比较详细的说明 策略模式 VS 桥梁模式 (画画,使用蜡笔和使用毛笔以及颜料的区别)
好了,这里先说 桥梁模式,最后再总结两者的区别
2.桥梁模式(还是那样,设计模式就是为了代码健壮,代码重用,所以高内聚,低耦合永远都是那么受欢迎,什么抽象类啊,接口啊···)
场景,农民施肥。
这里农民类 调用 肥料类,用的是组合的方式,也就是农民类中有一个成员属性是肥料类类型的(就是这里起到了桥梁的作用),
为了可扩展性,农民类写成抽象类,肥料类则写成接口;
在施肥这个动作中,不仅肥料的种类会变,而且农民这边也会改变,人工施肥,或者机器施肥等等,所以这里又两个可变因子。
而且这两个可变因子还可以随机组合的,如 人工施 化肥,人工施有机肥;或者 机器人施化肥,机器人施有机肥。
肥料接口 Manure:
1 package design.patterns.bridge2; 2 /** 3 * 肥料类 4 * */ 5 public interface Manure { 6 void manuring(); 7 }
使用接口的原因很简单,多态嘛
有机肥类,动物肥类 AnimalManure:
1 package design.patterns.bridge2; 2 3 public class AnimalManure implements Manure{ 4 5 @Override 6 public void manuring() { 7 System.out.println("==这是动物肥料,也就是翔····"); 8 } 9 10 }
化肥类 ChemicalManure:
1 package design.patterns.bridge2; 2 3 public class ChemicalManure implements Manure{ 4 5 @Override 6 public void manuring() { 7 System.out.println("==我是化肥···!"); 8 } 9 10 }
然后到抽象类 农民类 Farmer:
1 package design.patterns.bridge2; 2 /** 3 * 农民类 4 * */ 5 public abstract class Farmer { 6 protected Manure manure; 7 8 public Farmer(Manure manure){ 9 this.manure = manure; 10 } 11 12 abstract void doManuring(); 13 14 }
人类农民 HumanFarmer:
1 package design.patterns.bridge2; 2 3 public class HumanFarmer extends Farmer{ 4 5 public HumanFarmer(Manure manure) { 6 super(manure); 7 } 8 9 @Override 10 void doManuring() { 11 System.out.println("我是大农民,我爱劳动"); 12 manure.manuring(); 13 } 14 15 }
当科技发达后,可能会有机器人来施肥的 RobotFarmer:
1 package design.patterns.bridge2; 2 3 public class RobotFarmer extends Farmer{ 4 5 public RobotFarmer(Manure manure) { 6 super(manure); 7 } 8 9 @Override 10 void doManuring() { 11 System.out.println("机器人也可以施肥的哦。"); 12 manure.manuring(); 13 } 14 15 }
最后测试一下 Test类:
1 package design.patterns.bridge2; 2 3 public class Test { 4 public static void main(String[] args){ 5 //开始施肥 6 // //1.准备肥料 7 // Manure manure = new AnimalManure(); 8 //4.突然想施化肥了, 9 Manure manure = new ChemicalManure(); 10 //2.人工施肥,施的是有机肥, 动物肥 11 Farmer farmer = new HumanFarmer(manure); 12 // //5.人工施肥,的确较慢,以后会有机器人施肥的 13 // Farmer farmer = new RobotFarmer(manure); 14 15 16 //3.开工 17 work(farmer); 18 19 } 20 21 public static void work(Farmer farmer){ 22 farmer.doManuring(); 23 } 24 }
哎,真的惭愧,感觉我的例子说服力一般,如果理解不了,参考这里 桥梁模式(Bridge)(不同平台备分不同格式的log文件)
3.总结:
Strategy(策略模式)是调用者不变,变的只是被调用的方法;(候选模式嘛)
Bridge(桥梁模式)是 调用者和被调用者都可以改变。--可以看成策略模式的加强版(更加一步)