桥接模式

  • 概述
  • UML类图
  • 代码栗子
  • 总结
  1. 概述

    桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。
    

    • 来个栗子
      小明买了一辆法拉利,但是发现法拉利村里的人不认识,没法儿***,因此小明特地又去买了一辆宝马,这下就可以开出去不用解释这是啥车了,买回来后就开始要为爱车安装各种装饰品,它的两辆车可以任意搭配饰品,结论来了<抽象与实现分离、实现部分独立地变化>
    1. UML

      • 优点:实现系统可能有多角度分类,每一种分类都有可能变化,分离并独立变化,减少它们之间的耦合
  2. 栗子

    /*汽车基类*/
    public abstract class Car {
        /**
         * 安装导航仪
         * @param navigator
         */
        public abstract void installNavigator(INavigator navigator);
        
        /**
         * 开启导航
         * 开启导航是调用导航接口实现类的方法
         */
        public abstract void open();
    }
    
    /*宝马牌汽车*/
    public class BMWCar extends Car {
        /**导航仪*/
        INavigator navigator = null;
        
        @Override
        public void installNavigator(INavigator n) {
            System.out.println("宝马成功安装了:"+n.toString());
            navigator = n;
        }
        @Override
        public void open() {
            navigator.work();
        }
    }
    /*法拉利牌汽车*/
    public class FerrariCar extends Car {
        /**导航仪*/
        INavigator navigator = null;
       
        @Override
        public void installNavigator(INavigator n) {
            System.out.println("法拉利成功安装了:"+n.toString());
            navigator = n;
        }
        
        
        @Override
        public void open() {
            navigator.work();
        }
        
    }
    
    /*导航仪接口*/
    public interface INavigator { 
        /**
         *  导航实现
         */
    	void work();
    }
    
    /*高德导航仪*/
    public class AmapNavigator implements INavigator {
     
    	@Override
    	public void work() {
    		System.out.println("我是高德导航仪!");
    	}
        @Override
        public String toString() {
            return "【高德导航仪】";
        }
    }
    /*北斗导航仪*/
    public class BdNavigator implements INavigator {
        @Override
        public String toString() {
            return "【北斗牌导航仪】";
        }
        
        @Override
        public void work() {
            System.out.println("我是北斗导航仪!");
        }
    }
    
    • 测试

      public class Main {
      
      	public static void main(String[] args) {
              test1() ;
              test1_1() ;
          
          }
          public static void test1(){
              INavigator bdNavigator = new BdNavigator();
              //法拉利安装北斗导航
              Car ferrariCar = new FerrariCar() ;
              ferrariCar.installNavigator(bdNavigator);
              ferrariCar.open();
          }
          public static void test1_1(){
              INavigator amapNavigator = new AmapNavigator();
              //宝马安装了高德导航仪
              Car ghostCar = new BMWCar();
              ghostCar.installNavigator(amapNavigator);
              ghostCar.open();
          }
      }
      
  3. 总结

    1. 桥接方式比继承的方式要更灵活,它是汽车与配件可以独立各自的发展
    2. 当继承造成大量类增加且不能满足开闭原则时,可以考虑使用桥接模式
posted @ 2019-03-10 00:27  tanoak  阅读(107)  评论(0编辑  收藏  举报