为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Java
1、介绍

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

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

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

2、案例
2.1、情景

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

对应的UML类图如下:

图片描述

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、桥接模式特点

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

点击查看更多内容
5人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1万
获赞与收藏
1426

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消