白话-23种设计模式10-桥接模式

举报
object 发表于 2022/07/06 17:33:20 2022/07/06
【摘要】 一、白话  假设我是手机订购甲方,由于我是甲方爸爸,我现在对现有的几款手机并不是很满足,我希望他们能各自添加一些特殊的功能,可能会重复,也有可能不会。小米,华为,苹果。我希望小米可以唱歌,华为可以画画,苹果可以跳舞。然后各自的厂商就去在原先的的功能上添加了新的功能,交给我。我看了后,感觉又后悔了,我想不行,我华为可以唱歌,小米可以画画。然后他们又回去改,在原先的功能上添加功能,然后我又。。(...

一、白话

  假设我是手机订购甲方,由于我是甲方爸爸,我现在对现有的几款手机并不是很满足,我希望他们能各自添加一些特殊的功能,可能会重复,也有可能不会。小米,华为,苹果。我希望小米可以唱歌,华为可以画画,苹果可以跳舞。然后各自的厂商就去在原先的的功能上添加了新的功能,交给我。我看了后,感觉又后悔了,我想不行,我华为可以唱歌,小米可以画画。然后他们又回去改,在原先的功能上添加功能,然后我又。。(像不像客户经理,啥都不懂,要求贼多)。那这样下去,三家工厂肯定不干呀,但是我又是甲方爸爸,他们只能改。于是他们想了一个办法,成立了一个桥接工作室,只要是工作室成员的手机,无论谁来,都能完美加上相应的功能,这样,只要是功能限定在画画,唱歌,跳舞,我都可以随便换,想好了告诉他们就行。

  将手机和功能拆分开,并使用桥接手段连接起来,就是桥接模式,多维度的一个桥接使用。

  其中:各自的厂商各自添加新的功能,就类似于继承手段,添加新功能,但是随着换来换去,组合增多,就出现了类爆炸。后面统一桥接工作室,就是桥接模式,就是利用多态的特性实现多组合排列的特性

二、定义

  将一个继承关系变为组合关系。

  • 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
  • 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
  • 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
  • 具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现。

三、示例

// 抽象角色-统一手机
public abstract class Phone {
    public abstract void show();
}
// 修正抽象角色-具体手机
public class HuaWei extends Phone {
    @Override
    public void show() {
        System.out.println("华为手机展示功能==");
    }
}
// 修正抽象角色-具体手机
public class XiaoMi extends Phone {
    @Override
    public void show() {
        System.out.println("小米手机展示功能==");
    }
}
// 实现化角色-给出接口,不给具体实现
public abstract class Expansion {
    // 桥接-使用组合代替继承方式
    private Phone phone;
    
    public void setPhone(Phone phone) {
        this.phone = phone;
    }
    
    public Phone getPhone() {
        return this.phone;
    }
    
    // 新功能
    public abstract void addSomething();
}
// 具体抽象角色-具体实现接口
public class Sing extends Expansion {
    @Override
    public void addSomething() {
        getPhone().show();
        System.out.println("添加了新功能【唱歌】==");
    }
}
// 具体抽象角色-具体实现接口
public class Dance extends Expansion {
    @Override
    public void addSomething() {
        getPhone().show();
        System.out.println("添加了新功能【跳舞】==");
    }
}
public class BridgeApplication {

    // 客户端调用
    public static void main(String[] args) {
        // 获取具体实现
        Expansion sing = new Sing();
        Expansion dance = new Dance();
        // 桥接对象
        sing.setPhone(new HuaWei());
        dance.setPhone(new HuaWei());
        sing.addSomething();
        dance.addSomething();

        sing.setPhone(new XiaoMi());
        dance.setPhone(new XiaoMi());
        sing.addSomething();
        dance.addSomething();
    }
}

输出结果展示:   

华为手机展示功能==
添加了新功能【唱歌】==
华为手机展示功能==
添加了新功能【跳舞】==
小米手机展示功能==
添加了新功能【唱歌】==
小米手机展示功能==
添加了新功能【跳舞】==

  华为和小米都能和需求任意组合,无论怎么换都可以了。


四、总结

  优点:使用组合代替继承。降低了耦合性。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。