java设计模式之桥梁模式(Bridge)

1.桥梁模式 与 策略模式 非常相似

   (其实很多设计模式都相似,因为所有的模式都是按照设计原则 而设计出来的,设计原则就相当于武功的心法,设计模式就是招式,只要心法过硬,就可以无招胜有招了)

   这里也有比较详细的说明 策略模式 VS 桥梁模式 (画画,使用蜡笔和使用毛笔以及颜料的区别)

   好了,这里先说 桥梁模式,最后再总结两者的区别

2.桥梁模式(还是那样,设计模式就是为了代码健壮,代码重用,所以高内聚,低耦合永远都是那么受欢迎,什么抽象类啊,接口啊···)

   场景,农民施肥。

   这里农民类 调用 肥料类,用的是组合的方式,也就是农民类中有一个成员属性是肥料类类型的(就是这里起到了桥梁的作用),

   为了可扩展性,农民类写成抽象类,肥料类则写成接口;

   在施肥这个动作中,不仅肥料的种类会变,而且农民这边也会改变,人工施肥,或者机器施肥等等,所以这里又两个可变因子。

   而且这两个可变因子还可以随机组合的,如 人工施 化肥,人工施有机肥;或者 机器人施化肥,机器人施有机肥。

   肥料接口 Manure:

1 package design.patterns.bridge2;

2 /**

3  * 肥料类

4  * */

5 public interface Manure {

6     void manuring();

7 }
View Code

  使用接口的原因很简单,多态嘛

   有机肥类,动物肥类 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 }
View Code

  化肥类 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 }
View Code

  然后到抽象类 农民类 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 }
View Code

  人类农民 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 }
View Code

 当科技发达后,可能会有机器人来施肥的 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 }
View Code

  最后测试一下 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 }
View Code

 

  哎,真的惭愧,感觉我的例子说服力一般,如果理解不了,参考这里 桥梁模式(Bridge)(不同平台备分不同格式的log文件)

3.总结:

   Strategy(策略模式)是调用者不变变的只是被调用的方法;(候选模式嘛)
   Bridge(桥梁模式)是 调用者和被调用者都可以改变。--可以看成策略模式的加强版(更加一步)

 

你可能感兴趣的:(java设计模式)