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

  • 相关阅读:
    Multi-Channel Buffers
    FFmpeg 的bug
    关于游戏的网络同步探索1
    预处理、编译、汇编、链接、启动代码、相关command
    Linux命令——whiptail交互式shell脚本对话框
    实模式、保护模式、三种地址、分段、分页
    XAMPP + PhpStorm + Xdebug本地实验环境搭建
    Web数据库架构
    PHP语法基础
    A quick introduction to Source Insight for seamless development platform between Linux and Windows
  • 原文地址:https://www.cnblogs.com/tommy-huang/p/4344683.html
Copyright © 2011-2022 走看看