首页 > 编程语言 >java设计模式-桥接模式

java设计模式-桥接模式

时间:2024-08-11 20:38:57浏览次数:9  
标签:java 桥接 phoneInterface System China println new 设计模式 public

 一. 概述

        桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。桥接模式主要目的是解决当一个类存在多个继承等级时,由于继承带来的耦合问题,以及扩展性不足的问题。

  • 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承
  • 类型:结构性。

二. 使用场景

  1. 抽象和具体实现之间增加更多的灵活性
  2. 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
  3. 不希望使用继承,或因为多层继承导致系统类的个数剧增

 三. 桥接模式的原理及代码示例

1. 桥接模式的组成部分:

  1. 抽象化(Abstraction)角色 :主要负责定义出该角色的行为 ,并包含一个对实现化对象的引用。
  2. 扩展抽象化(RefinedAbstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. 实现化(Implementor)角色 :定义实现化角色的接口,包含角色必须的行为和属性,并供扩展抽象化角色调用。
  4. 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

2. UML图

 

3. 桥接模式具体实现步骤:

  1. 定义实手机接口
  2. 实现手机接口(不同的品牌添加不同的实现类)
  3. 定义抽象类(通过这个抽象类实现抽象和具体实现分离)
  4. 实现抽象类。
  5. 在扩展抽象化角色中,组合实现化角色的实例,并实现具体的行为。

4. 示例代码

        代码示例以手机和产地为例,手机分为国产品牌和美国品牌,国产手机可分为华为,vivo等,美国有苹果手机,谷歌手机等,对国产手机的添加只需添加一个具体实现类即可,如果想要添加一个韩国的手机则需要对抽象类进行继承实现。

  • 1. 定义接口
package com.seata;
/**
 * 文件名:dnm
 * 创建者:
 * 创建时间:
 * 描述:手机品牌接口
 */
public interface IMobilePhoneInterface {
    void showMobilePhone();
}
  • 2. 实现类(华为手机)
package com.seata;

/**
 * 文件名:HuaWeiMobilePhone
 * 创建者:
 * 创建时间:
 * 描述:华为品牌手机
 */
public class HuaWeiMobilePhone implements IMobilePhoneInterface{
    @Override
    public void showMobilePhone() {
        System.out.println("华为手机");
    }
}
  • 3. 实现类(苹果手机)
package com.seata;

/**
 * 文件名:AmericaMobilePhone
 * 创建者:
 * 创建时间:
 * 描述:苹果手机
 */
public class AppleMobilePhone implements IMobilePhoneInterface{
    @Override
    public void showMobilePhone() {
        System.out.println("苹果手机");
    }
}
  • 4. 定义抽象类
package com.seata;

/**
 * 文件名:CountryAbstract
 * 创建者:
 * 创建时间:
 * 描述:抽象类
 */
public abstract class CountryAbstract {

    // 持有接口属性
    protected IMobilePhoneInterface phoneInterface;

    public CountryAbstract(IMobilePhoneInterface phoneInterface){
        this.phoneInterface = phoneInterface;
    }

    abstract void showCountry();

}
  • 5. 国产品牌
package com.seata;

/**
 * 文件名:China
 * 创建者:
 * 创建时间:
 * 描述:国产品牌
 */
public class China extends CountryAbstract{

    public China(IMobilePhoneInterface phoneInterface){
        super(phoneInterface);
    }

    @Override
    void showCountry() {
        phoneInterface.showMobilePhone();
        System.out.println("国产品牌");
    }
}
  • 6. 美国品牌
package com.seata;

/**
 * 文件名:America
 * 创建者:
 * 创建时间:
 * 描述:美国品牌
 */
public class America extends CountryAbstract{

    public America(IMobilePhoneInterface phoneInterface){
        super(phoneInterface);
    }

    @Override
    void showCountry() {
        phoneInterface.showMobilePhone();
        System.out.println("美国品牌");
    }
}
  • 7. 测试类
package com.seata;

/**
 * 文件名:Test
 * 创建者:
 * 创建时间:
 * 描述:  测试类
 */
public class Test {

    public static void main(String[] args) {
        //国产品牌
        China countryAbstract = new China(new HuaWeiMobilePhone());
        countryAbstract.showCountry();
        System.out.println("=======================================");
        //美国品牌
        America anAbstract = new America(new AppleMobilePhone());
        anAbstract.showCountry();
    }
}

 测试结果

 

  • 8. 假如我们想要添加一个国产 vivo 手机,只需要在添加一个实现类即可
package com.seata;

/**
 * 文件名:VivoMobilePhone
 * 创建者:
 * 创建时间:
 * 描述:vivo手机
 */
public class VivoMobilePhone implements IMobilePhoneInterface{
    @Override
    public void showMobilePhone() {
        System.out.println("vivo 手机");
    }
}

测试类添加

package com.seata;

/**
 * 文件名:Test
 * 创建者:
 * 创建时间:
 * 描述:  测试类
 */
public class Test {

    public static void main(String[] args) {
        //国产品牌
        China countryAbstract = new China(new HuaWeiMobilePhone());
        countryAbstract.showCountry();
        System.out.println("=======================================");
        //美国品牌
        America anAbstract = new America(new AppleMobilePhone());
        anAbstract.showCountry();
        System.out.println("=======================================");
        //Vivo品牌
        China china = new China(new VivoMobilePhone());
        china.showCountry();
    }
}

测试结果

 

 

  • 9.假如我们想要添加一个韩国的三星品牌手机,这个时候需要添加抽象类的实现类,再添加一个具体实现类

添加抽象类的实现类

package com.seata;

/**
 * 文件名:BnagZiMobilePhone
 * 创建者:
 * 创建时间:
 * 描述:韩国
 */
public class BnagZi extends CountryAbstract{

    public BnagZi(IMobilePhoneInterface phoneInterface){
        super(phoneInterface);
    }

    @Override
    void showCountry() {
        phoneInterface.showMobilePhone();
        System.out.println("韩国品牌");
    }
}

添加手机品牌具体实现类

package com.seata;

/**
 * 文件名:BnagZiMobilePhone
 * 创建者:
 * 创建时间:
 * 描述:三星手机
 */
public class SanXingMobilePhone implements IMobilePhoneInterface{
    @Override
    public void showMobilePhone() {
        System.out.println("三星手机");
    }
}

测试类

package com.seata;

/**
 * 文件名:Test
 * 创建者:
 * 创建时间:
 * 描述:  测试类
 */
public class Test {

    public static void main(String[] args) {
        //国产品牌
        China countryAbstract = new China(new HuaWeiMobilePhone());
        countryAbstract.showCountry();
        System.out.println("=======================================");
        //美国品牌
        America anAbstract = new America(new AppleMobilePhone());
        anAbstract.showCountry();
        System.out.println("=======================================");
        //Vivo品牌
        China china = new China(new VivoMobilePhone());
        china.showCountry();
        System.out.println("=======================================");
        //三星品牌
        BnagZi bnagZi = new BnagZi(new SanXingMobilePhone());
        bnagZi.showCountry();
    }
}

测试结果

 

 

四. 桥接模式的优缺点

优点:

  1. 分离抽象部分及其具体实现部分,解耦抽象与实现的绑定关系
  2. 提高了系统的可扩展性
  3. 符合开闭原则
  4. 符合合成复用原则

缺点:

  1. 增加了系统的理解与设计难度
  2. 需要正确的识别出系统中两个独立变化的维度

标签:java,桥接,phoneInterface,System,China,println,new,设计模式,public
From: https://www.cnblogs.com/ningbeibei/p/18353863

相关文章

  • Java中的抽象类与接口
    1.抽象类1.1抽象类概念在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。比如:像这种没有实际工作的方法,我们可以把它设计成一个抽象方法(abst......
  • #java学习笔记(面向对象)----(未完结)
    一基础相关知识点:1.一个对象的调用首先我们创建一个Phone类publicclassPhone{//成员变量Stringname;intage;Stringfavourite;//成员方法publicvoidmyName(){System.out.println(name);}publicvoidmyAge(){......
  • Java面试题--数据库集群
    Mysql主从解决什么问题,不能解决什么问题?MySQL主从同步,主负责写,从负责读,使用一主多从,能减轻读的压力但是这不能解决写的压力和主库的单点故障,如果主库的写并发高,可以做成多个主库MySql主从复制原理?主要依靠binlog来实现的,它记录的是所有的DDL,DML,TCL操作当主库的数据发生改......
  • Java常见设计模式简介
    设计模式什么是单例,如何实现一个类只能有一个实例,主要用于需要频繁使用的对象避免频繁初始化和销毁来提高性能,或者资源需要相互通信的环境主要实现方式有,饿汉模式,懒汉模式,枚举,静态内部类饿汉模式,是在类加载过程中就将这个单例对象实例化,需要将构造方法私有化,定义一个成员变......
  • Windows平台Hyper-V下使用iKuai作为主路由实现网口桥接
    Windows平台Hyper-V下使用iKuai作为主路由实现网口桥接问题背景在使用iKuai作为主路由时,可能会遇到后添加的虚拟端口下的设备无法联网的问题,这可能是iKuai的一个bug。解决方案以下是解决Windows平台Hyper-V下iKuai主路由网口桥接问题的步骤:确定主要网卡:观察并确定网桥使用的......
  • Java基础7
    面向对象的特征一:封装性随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”高内聚:类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用。何为封装性?所谓封装性,就是把客......
  • Java超市收银系统(四、收银功能)
    引言        今天,我们实现收银功能。系统显示“请输入商品条形码(6位数字字符):”,用户输入的条形码在商品表中存在,则显示“输入商品数量:”,否则,提示“您输入的商品条形码不存在,请确认后重新输入”,条形码和数量输入完毕后在销售明细表中增加一条记录(各字段信息如下:流水号......
  • Java超市收银系统(三、密码修改)
    引言        我们还是用之前使用的方法,只不过这次是为了实现密码修改功能,在4个包除了vo包,其余我们都需要修改增加。功能函数包(增删改查)—dao        在我们对数据库进行简单操作时,最主要的数据操作就是增加、删除、修改、查询,我们之前已经写了用户名查询函......
  • Java超市收银系统(一、用户登录)
    引言        今天,我们来学习一下如何用java写一个简单的系统(后续内容包括网络连接、数据库连接、json字符串编码、爬虫、数据增删改查、线程处理等等)会不间断更新,首先是环境配置要求,我们需要在maven库中下载4个包,分别是Jsoup、Gson、JXL、mysql用于字符串解析、数据库......
  • Java计算机毕业设计的场馆预订系统的设计与实现(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着全民健身热潮的兴起和体育产业的蓬勃发展,体育场馆作为体育活动的重要载体,其高效管理和便捷服务需求日益凸显。然而,传统的手工预订或简单的在线预......