zoukankan      html  css  js  c++  java
  • 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(桥梁模式)是 调用者和被调用者都可以改变。--可以看成策略模式的加强版(更加一步)

  • 相关阅读:
    Redis源代码分析(十三)--- redis-benchmark性能測试
    kvm中运行kvm
    umount.nfs device busy day virsh extend diskSpace, attachDisk
    ultravnc
    openNebula dubug
    maintenance ShellScripts
    virsh VMI deploy data serial xml
    cloud computing platform,virtual authentication encryption
    基于C 的libvirt 接口调用
    storage theory
  • 原文地址:https://www.cnblogs.com/tommy-huang/p/4344683.html
Copyright © 2011-2022 走看看