身为java开发人员,你知道桥接模式还能这样用吗?

235 篇文章 3 订阅

桥接模式

桥接模式定义:

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。

在生活中有很多桥接模式的例子,比如:

  • 在纸上画图,可以选择红色的彩笔,也可以选择绿色的彩笔;
  • 自制饮料,可以选择西瓜做原材料,也可以选择草莓做原材料;
  • 泡茶,可以选择毛尖茶,也可以选择花茶;

这些例子的共同特点都是做一件事,可以选择不同的方法去做,并且做得结果是不同的;

所以桥接模式的含义就是,将这些不同的方法(实现部分)分离出来,使它们可以独立变化。

模式优缺点

优点
  • 由于抽象与实现分离,所以扩展能力强;
  • 其实现细节对客户透明。
缺点
  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。

模式角色

  • 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

示例

1. 示例描述

制作饮料案例,选择不同的原材料做果汁,原材料有苹果、橘子。

2. 设计思路

可以按照以下步骤进行

  1. 定义桥接口,原材料不同导致最终结果不同,所以桥接口定义为果汁源材料JuiceMaterial
  2. 定义具体原材料,AppleMaterial和OrangeMaterial
  3. 定义抽象类Machine,并抽象work方法
  4. 定义榨汁机具体类JuiceExtractor 并集成Machine,重写工作方法,并可以更换原材料。
3. 示例代码
  • 果汁原材料抽象接口

    /**
     * @Description 果汁原材料
     */
    public interface JuiceMaterial {
        /**
         * 获取原材料名
         * @return 原材料名
         */
        String getMaterial();
    }
    
    
  • 原材料具体接口

    /**
     * @Description 苹果原材料
     */
    public class AppleMaterial implements JuiceMaterial {
        @Override
        public String getMaterial() {
            return "apple";
        }
    }
    /**
     * @Description 橘子原材料
     */
    public class OrangeMaterial implements JuiceMaterial {
        @Override
        public String getMaterial() {
            return "orange";
        }
    }
    
    
  • 抽象机器接口

    /**
     * @Description 机器
     */
    public abstract class Machine {
        /**
         * 机器工作运转
         */
        protected abstract void work();
    }
    
    
  • 具体机器接口

    /**
     * @Description 榨汁机
     */
    public class JuiceExtractor extends Machine {
    
        private JuiceMaterial juiceMaterial;
    
        public JuiceExtractor(JuiceMaterial material){
            this.juiceMaterial = material;
        }
    
        @Override
        protected void work() {
            System.out.println(
                    String.format("The %s juice is being squeezed!" , this.juiceMaterial.getMaterial())
            );
        }
    }
    
    
  • 测试代码

    	@Test
        public void test(){
            JuiceMaterial appleMaterial = new AppleMaterial();
            JuiceMaterial orangeMaterial = new OrangeMaterial();
    
            Machine appleJuiceExtractor = new JuiceExtractor(appleMaterial);
            appleJuiceExtractor.work();
    
            Machine orangeJuiceExtractor = new JuiceExtractor(orangeMaterial);
            orangeJuiceExtractor.work();
        }
    
    
  • 测试结果

    The apple juice is being squeezed!
    The orange juice is being squeezed!

最后

感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值