全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java设计模式之桥接模式实例详解

本文实例讲述了Java设计模式之桥接模式。分享给大家供大家参考,具体如下:

概念:

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。

什么情况下会用桥接模式?

简单的说就是我们在抽象对象的特征时,对象的特征属性又很抽象,不得不把属性再次抽象。

否则的话,具体子类的数量将会成几何增长,而且不易扩展。没办法维护现有代码。

举例,我们在抽象手机这二个对象时,它的几个属性,如操作系统,cpu,屏幕,运营商网络等都很复杂。我们不能简单的把这几个属性直接定义,必须再次抽象化。而具体的一个手机对象就是这些属性的组合,但不是简单的组合,属性需要实现自己作为属性的功能。在这样的设计下,代码的维护和扩展也就容易了。

注意:在说这个模式的时候,我不能保证说的和写得例子都是正确的,毕竟我也是新接触到,所有例子均基于与个人理解。

我认为的桥接模式说明图:

下面是例子:

1. 首先定义抽象类,抽象和描述对象的特征。

在对象的属性上划分维度,为了以后桥接和扩展。

package test.design.bridge;
public abstract class CellPhone {
  private String cellPhoneName;
  public CellPhoneSystem cellPhoneSystem;
  public CellPhoneCPU cellPhoneCPU;
  public void works(){
    System.out.println("---------------------");
    System.out.println("This cellphone is:"+this.getCellPhoneName()+",welcome to use. ");
    System.out.println("This cellphone detail infomation:");
    System.out.println("系统类型:"+this.getCellPhoneSystem().getSystemName());
    System.out.println("cpu型号:"+this.getCellPhoneCPU().getCpuName());
    System.out.println("---------------------");
  }
  public String getCellPhoneName() {
    return cellPhoneName;
  }
  public void setCellPhoneName(String cellPhoneName) {
    this.cellPhoneName = cellPhoneName;
  }
  public CellPhoneSystem getCellPhoneSystem() {
    return cellPhoneSystem;
  }
  public void setCellPhoneSystem(CellPhoneSystem cellPhoneSystem) {
    this.cellPhoneSystem = cellPhoneSystem;
  }
  public CellPhoneCPU getCellPhoneCPU() {
    return cellPhoneCPU;
  }
  public void setCellPhoneCPU(CellPhoneCPU cellPhoneCPU) {
    this.cellPhoneCPU = cellPhoneCPU;
  }
}

2. 属性维度的抽象。(可以使用接口定义,关键看你的具体功能)

package test.design.bridge;
/**
 * 属性cpu被抽象成一个维度,为了以后扩展
 * @author lushuaiyin
 *
 */
public abstract class CellPhoneCPU {
  public CellPhone cellPhone;
  public String cpuName;
  public void cpuWorks(){
    System.out.println("I am cpu. My pattern is:"+this.getCpuName());
    System.out.println("I am working for this cellphone:"+this.getCellPhone().getCellPhoneName());
  }
  public CellPhone getCellPhone() {
    return cellPhone;
  }
  public void setCellPhone(CellPhone cellPhone) {
    this.cellPhone = cellPhone;
    this.getCellPhone().setCellPhoneCPU(this);// 装配(桥接,或者可以认为对象类与其属性类的传递)
  }
  public String getCpuName() {
    return cpuName;
  }
  public void setCpuName(String cpuName) {
    this.cpuName = cpuName;
  }
}

package test.design.bridge;
/**
 * 属性操作系统被抽象成一个维度,为了以后扩展
 * @author lushuaiyin
 *
 */
public abstract class CellPhoneSystem {
  public CellPhone cellPhone;
  public String SystemName;
  public void systemWorks(){
    System.out.println("I am "+this.getSystemName()+" system.");
    System.out.println("I am working for this cellphone:"+this.getCellPhone().getCellPhoneName());
  }
  public CellPhone getCellPhone() {
    return cellPhone;
  }
  public void setCellPhone(CellPhone cellPhone) {
    this.cellPhone = cellPhone;
    this.getCellPhone().setCellPhoneSystem(this);// 装配(桥接,或者可以认为对象类与其属性类的传递)
  }
  public String getSystemName() {
    return SystemName;
  }
  public void setSystemName(String systemName) {
    SystemName = systemName;
  }
}

3. 具体的维度属性对象。

这里我们在操作系统属性和cpu属性上各定义2个具体对象,

package test.design.bridge;
public class AndroidSystem extends CellPhoneSystem{
}

package test.design.bridge;
public class IOSSystem extends CellPhoneSystem{
}

package test.design.bridge;
/**
 * 双核cpu
 * @author Administrator
 *
 */
public class TwoCore extends CellPhoneCPU{
}

package test.design.bridge;
/**
 * 四核cpu
 * @author Administrator
 *
 */
public class FourCore extends CellPhoneCPU{
}

4. 测试代码。

其中说了在需要扩展维度的情况下,怎么扩展的。

定义一个手机对象

package test.design.bridge;
public class Phone1 extends CellPhone{
  //具体对象的属性与逻辑
}

测试main函数

package test.design.bridge;
public class TestMain {
  /**
   * @param args
   */
  public static void main(String[] args) {
    //任何一种具体的对象都是复杂多种属性的集合,在此可以看出桥接模式在构建对象时的灵活性
    //产生一个具体对象1
    CellPhone p1=new Phone1();
    p1.setCellPhoneName(" IPhone 6 ");
    CellPhoneSystem system1=new IOSSystem();//操作系统属性维度
    system1.setSystemName("ios7");
    system1.setCellPhone(p1);//装配
    system1.systemWorks();//工作
    /*装配说的简单点就是传值。因为我们把一个对象的属性按维度分开来了,
     那么桥接的时候就必须相互传递对象。即对象类可以调用子属相类对象,
     子属性类对象也可以调用该对象类.
     关于这样的传值方式有多种,你可以在构造函数中传递,也可以在
    调用具体逻辑方法时传递。这里我直接用set方法传递,只是为了更清楚.
    如果某个属性维度是必须出现的,那就可以在抽象类的构造函数中传入*/
    CellPhoneCPU cpu1=new TwoCore();//cpu属性维度
    cpu1.setCpuName("A6");
    cpu1.setCellPhone(p1);
    cpu1.cpuWorks();
    p1.works();//最终整体对象功能
    /*
    桥接模式就是为了应对属性的扩展,在此说的属性必须是在维度确定的情况下。
    比如,这里我们在定义手机对象时,确定两个属性维度:操作系统和cpu型号。
    以后再这两个属性中,需要扩展时,就可以使用该模式。比如,一种新的cpu
    型号出现了,那么我不用重新设计现在的代码,只要增添一个cpu类即可。
    如果出现了新的维度属性,比如手机对象必须考虑屏幕大小。那桥接模式
    在此就需要从根本上修改代码来了。
    */
    System.out.println("-----------分割---------------------------");
    //在cpu维度上扩展。比如出现新型cpu:8核三星Exynos 5 Octa芯片".
    //三星手机推出了GALAXY Note Ⅲ就是使用这种新型cpu. 写一个新类EightCore扩展cpu维度.
    //同时定义这个手机对象GALAXY Note Ⅲ为PhoneGalaxyNote3
    CellPhone note3=new PhoneGalaxyNote3();
    note3.setCellPhoneName("GALAXY Note Ⅲ");
    CellPhoneSystem system2=new AndroidSystem();
    system2.setSystemName("android4");
    system2.setCellPhone(note3);//装配
    system2.systemWorks();//工作
    CellPhoneCPU cpu2=new EightCore();//最新8核cpu
    cpu2.setCpuName("三星Exynos 5 Octa芯片");
    cpu2.setCellPhone(note3);
    cpu2.cpuWorks();
    note3.works();//三星GALAXY Note Ⅲ新体验
  }
}

如果需要扩展,定义新的维度属性

package test.design.bridge;
public class EightCore extends CellPhoneCPU {
}

package test.design.bridge;
public class PhoneGalaxyNote3 extends CellPhone{
  //具体对象的属性与逻辑
}

测试打印;

I am ios7 system.
I am working for this cellphone: IPhone 6
I am cpu. My pattern is:A6
I am working for this cellphone: IPhone 6
---------------------
This cellphone is: IPhone 6 ,welcome to use.
This cellphone detail infomation:
系统类型:ios7
cpu型号:A6
---------------------
-----------分割---------------------------
I am android4 system.
I am working for this cellphone:GALAXY Note Ⅲ
I am cpu. My pattern is:三星Exynos 5 Octa芯片
I am working for this cellphone:GALAXY Note Ⅲ
---------------------
This cellphone is:GALAXY Note Ⅲ,welcome to use.
This cellphone detail infomation:
系统类型:android4
cpu型号:三星Exynos 5 Octa芯片
---------------------

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


# Java  # 设计模式  # 桥接模式  # Java设计模式中的桥接模式  # 详解Java设计模式之桥接模式  # Java设计模式以虹猫蓝兔的故事讲解桥接模式  # Java设计模式之桥接模式的示例详解  # 深入理解Java设计模式之桥接模式  # Java设计模式之java桥接模式详解  # java设计模式--桥接模式详解  # Java设计模式之桥接模式的实现  # Java结构型设计模式之桥接模式详细讲解  # 桥接  # 在此  # 操作系统  # 都是  # 来了  # 情况下  # 出现了  # 操作技巧  # 几个  # 是在  # 相关内容  # 你可以  # 抽象类  # 那就  # 也就  # 将会  # 子类  # 的说  # 说了  # 感兴趣 


相关文章: 简单实现Android文件上传  临沂网站制作企业,临沂第三中学官方网站?  如何解决VPS建站LNMP环境配置常见问题?  浅谈Javascript中的Label语句  建站之星如何配置系统实现高效建站?  建站之星收费标准详解:套餐费用及年费价格表一览  如何快速辨别茅台真假?关键步骤解析  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  建站之星伪静态规则如何正确配置?  深圳网站制作的公司有哪些,dido官方网站?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  css网站制作参考文献有哪些,易聊怎么注册?  如何选择域名并搭建高效网站?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何在阿里云部署织梦网站?  小建面朝正北,A点实际方位是否存在偏差?  微信小程序 五星评分(包括半颗星评分)实例代码  如何用y主机助手快速搭建网站?  建站DNS解析失败?如何正确配置域名服务器?  如何在橙子建站中快速调整背景颜色?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  定制建站价位费用解析与套餐推荐全攻略  如何通过建站之星自助学习解决操作问题?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  建站之星CMS五站合一模板配置与SEO优化指南  建站之星客服服务时间及联系方式如何?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  长沙做网站要多少钱,长沙国安网络怎么样?  制作网站公司那家好,网络公司是做什么的?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  网站企业制作流程,用什么语言做企业网站比较好?  如何高效完成独享虚拟主机建站?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  定制建站如何定义?其核心优势是什么?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  建站之星安装失败:服务器环境不兼容?  已有域名如何免费搭建网站?  广州建站公司哪家好?十大优质服务商推荐  Android滚轮选择时间控件使用详解  建站主机如何安装配置?新手必看操作指南  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  如何用西部建站助手快速创建专业网站?  北京制作网站的公司,北京铁路集团官方网站?  如何在建站之星网店版论坛获取技术支持?  实现虚拟支付需哪些建站技术支撑?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  网站制作费用多少钱,一个网站的运营,需要哪些费用?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。