Java设计模式(7)----------桥接模式

2019-06-15 00:00:00 java 模式 设计


1、介绍

桥接模式是一种结构型的设计模式,主要是特点是将抽象部分与实现部分分离开来,从而能够进行独自的变化。在桥接模式中,所谓的桥,个人理解是在抽象层中,将接口联系到一个抽象类中,更确切的说,是依赖关系。桥接模式主要适用场景是,某个对象需要从两个或者多个(一般是两个)维度进行描述或者操作的时候,能够简洁的进行处理。

特点:抽象与实现分离。抽象层依赖,具有非常好的扩展性。

适用场景:当场景中某个事物需要从两个或者多个维度进行描述或者操作。


2、案例

2.1、情景

举一个在饭店(抽象类)吃饭(动作接口)的例子。我们可以选择在香格里拉(具体类)吃饭,也可以在希尔顿(具体类)吃饭。两个酒店都可以提供烤肉(吃烤肉,动作接口实现类)和沙拉(吃沙拉,动作接口实现类)。我们的操作或者描述的问题,就是在什么酒店吃什么的问题。很显然,这是一个2维度的选择组合的动作,那么就可以通过桥接模式的思路来进行实现。

对应的UML类图如下:

《Java设计模式(7)----------桥接模式》


2.2、实现

1)吃饭接口

public interface EatFood
{
    String eat();
}

2)吃饭实现类

public class EatMeat implements EatFood
{
    @Override
    public String eat()
    {
        return "烤肉";
    }
}
public class EatSalad implements EatFood
{
    @Override
    public String eat()
    {
        return "沙拉";
    }
}

3)餐厅抽象类

public abstract class Restaurant
{
    protected EatFood eatFood;

    public Restaurant(EatFood eatFood)
    {
        this.eatFood = eatFood;
    }
    public abstract String action();
}

4)餐厅实体类

public class ShangriLa extends Restaurant
{
    public ShangriLa(EatFood eatFood)
    {
        super(eatFood);
    }

    @Override
    public String action()
    {
        return "在香格里拉酒店吃" + eatFood.eat();
    }
}
public class Healton extends Restaurant
{
    public Healton(EatFood eatFood)
    {
        super(eatFood);
    }

    @Override
    public String action()
    {
        return "在希尔顿酒店吃" + eatFood.eat();
    }
}

5)验证程序

/**
 * 验证
 */
public class Demo
{
    public static void main(String[] args)
    {
        Restaurant restaurant = new ShangriLa(new EatMeat());
        System.out.println(restaurant.action());

        Restaurant restaurant1 = new Healton(new EatSalad());
        System.out.println(restaurant1.action());
    }
}

6)运行结果

在香格里拉酒店吃烤肉
在希尔顿酒店吃沙拉

Process finished with exit code 0


3、总结

3.1、与抽象工厂的异同

上文讲到,桥接模式的适用场景是需要从两个或者多个维度去描述或者操作事物。而抽象工厂模式也与“多个维度”相关。这两种模式的适用场景都是涉及多维度的。但是是存在区别的,抽象工厂模式更关注对象的创建,是创建型设计模式。而桥接模式则是关注对象创建之后的动作或者功能。所以两者的区别是比较明显的。


3.2、桥接模式特点

桥接模式的特点是将抽象与实现分离,在抽象层建立依赖关系,从而两个维度上的实现类可以进行各自的变化不会相互影响,具有非常好的扩展性。

相关文章