波神

导航

java常用设计模式九:桥接模式

一、概述

       将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式。比如存在2个维度,第一个维度有一个抽象类A和对应的子类A1和A2;第二个维度有另一个接口B和对应的子类B1和B2;接口A依赖接口B。

       所谓的独立变化就是当我们修改A1和A2或是修改B1和B2对方都不用修改。这种抽象依赖就像桥接

二、示例

 比如上图所示:动物(抽象类)路(接口),动物有狗(具体类)猫(具体类),路有大路(具体类)小路(具体类),要实现的就是  “什么动物在什么路走路”,这就是一个2维度组合,而且2个维度都可以进行独立变化。

 1)动物接口

public interface Animal {
    void walk();
}

2)动物实现类

public class Dog implements Animal {
    public void walk() {
        System.out.println("狗走路");
    }
}
public class Cat implements Animal {
    public void walk() {
        System.out.println("猫走路");
    }
}

3)路抽象类

public abstract class Road {
    protected Animal animal;
    public Road(Animal animal){
        this.animal = animal;
    }
    public abstract void place();
}

4)路的实现类

public class BigRoad extends Road {

    public BigRoad(Animal animal) {
        super(animal);
    }
    public void place() {
        System.out.println("在大路上");
        animal.walk();
    }
}
package bridge.demo;

/**
 * @author Administrator
 * @date 2019/01/11
 */
public class SmallRoad extends Road{

    public SmallRoad(Animal animal) {
        super(animal);
    }

    public void place() {
        System.out.println("在小路上");
        animal.walk();
    }
}

5)测试类

public class Client {
    public static void main(String[] args){
        Animal dog = new Dog();
        Animal cat = new Cat();
        Road road1= new BigRoad(dog);
        Road road2= new SmallRoad(cat);
        Road road3= new SmallRoad(dog);
        Road road4= new SmallRoad(cat);
        road1.place();
        road2.place();
        road3.place();
        road4.place();
    }
}
在大路上
狗走路
在小路上
猫走路
在小路上
狗走路
在小路上
猫走路

 

细心的人会发现:桥接模式与抽象工厂模式很相似,都是2个维度上的变化。但是有以下区别:

  • 桥接模式属于结构型模式,不是以创建对象的为目的,一般对象的创建是交给Client类去new 一个对象,对象已经存在后,怎么来组合使用这些对象;
  • 抽象工厂模式属于创建型模式,以创建对象为目的,一般会在工厂类内部提供new 一个对象的方法。

 

posted on 2019-01-11 16:12  波神  阅读(262)  评论(0编辑  收藏  举报