Java实现桥接模式

原创 2018年04月16日 09:47:57

22.2 紧耦合程序演化

两个手机品牌,都有游戏,两个手机是不同的操作系统。怎么写?
该有一个父类手机品牌游戏,让N和M品牌手机游戏都继承它。

如果N和M品牌手机又都增加了通讯录功能呢?
这里写图片描述

基于这个模型,那如果新增加一个手机品牌,并且每个手机品牌增加各种功能,例如:游戏、通讯录、MP3等。

那样就会变得非常麻烦。

继承的问题
无法在运行时改变从父类继承的实现,子类和父类依赖关系紧密,父类中任何变化都会导致子类发生变化。
当复用子类时,如果继承下来的子类不适合解决新问题,则父类必须重写或被其他更适合的类替换,导致限制了复用性。

面向对象中首先使用合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承。

22.3 合成/聚合复用原则

聚合
表示“弱”的拥有关系,A对象可包含B对象,但B对象不是A对象的一部分;
合成
是一种“强”的拥有关系,部分和整体的生命周期是一样的。

大雁和翅膀就类似于合成关系;每只大雁是属于一个雁群,一个雁群有多只大雁,所以大雁和雁群是聚合关系。
这里写图片描述

好处
优先使用对象的合成/聚合有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,且不太可能增长为不控制的庞然大物。

22.4 松耦合的程序

根据这个原则,修改之前的类结构。
这里写图片描述
手机品牌包含有手机软件,但软件不是品牌的一部分,所以是聚合关系。

手机软件

public abstract class HandsetSoft {

    public abstract void run();
}

游戏、通讯录等具体类

public class HandsetGame extends HandsetSoft {

    @Override
    public void run(){
        println("游戏");
    }
}

public class HandsetAddress extends HandsetSoft {

    @Override
    public void run(){
        println("通讯录");
    }
}

手机品牌类

public abstract class HandsetBrand {
    //弱聚合
    protected HandsetSoft soft;

    //设置手机软件
    public void setHandsetSoft(HandsetSoft soft){
        this.soft = soft;
    }

    //运行
    public abstract void run();
}

品牌N品牌M等具体类

//品牌N
class HandsetBrandN extends HandsetBrand {

    @Override
    public void run(){
        soft.run();
    }
}

//品牌M
class HandsetBrandM extends HandsetBrand {

    @Override
    public void run(){
        soft.run();
    }
}

客户端

public class Main {
    HandsetBrand ab;
    //创建品牌N
    ab = new HandsetBrandN();

    //给品牌N安装游戏
    ab.setHandsetSoft(new HandsetGame());
    ab.run();

    //给品牌N安装通讯录
    ab.setHandsetSoft(new HandsetAddress());
    ab.run();
}

22.5 桥接模式

将抽象部分和它的实现部分分离,使它们都可以独立的变化。

就像之前例子,让手机既可以按品牌分类,也可以按功能来分类。
这里写图片描述
Implementor类

public abstract class Implementor {
    public abstract void operation();
}

ConcreteImplementorA和ConcreteImplementorB等派生类

public class ConcreteImplementorA extends Implementor{
    @Override
    public void operation(){
        println("具体实现A的方法执行");
    }
}

public class ConcreteImplementorB extends Implementor{
    @Override
    public void operation(){
        println("具体实现B的方法执行");
    }
}

Abstraction类

public abstract class Abstraction {
    protected Implementor impl;

    public Abstraction(Implementor impl){
        this.impl = impl;
    }

    public abstract void operation();
}

RefinedAbstraction类

public class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(Implementor impl){
        super(impl);
    }

    @Override
    public void operation(){
        impl.operation();
    }
}

客户端实现

public class Main {
    public static void main(String[] args){
        Abstraction ab = new RefinedAbstraction(new ConcreteImplementorA());
        ab.operation();

        ab = new RefinedAbstraction(new ConcreteImplementorB());
        ab.operation();
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载哦。 https://blog.csdn.net/a464700300/article/details/79956617

《Java + JDBC + Freemarker引擎实现代码生成器》

本主要是针对有一定基础的Java学员。本课程主要是围绕着如何根据公司具体的技术架构,手把手的实现一个强大的代码生成器。该生成器主要包括如果根据数据库表,自动生成 Model 文件,DTO 文件,DAO 文件,MyBatis的 Mappter 文件,Service 文件,Controller文件等等,包括基本的增删改查,分页,搜索查询等等接口代码自动生成。
  • 2017年06月10日 02:38

Java 传统桥接模式

桥接模式(bridge pattern)是一种策略式委派方式,其主要目标是避免类型爆炸。
  • yqj2065
  • yqj2065
  • 2014-09-01 02:05:29
  • 1957

桥接模式java示例代码

  • 2016年01月11日 21:14
  • 10KB
  • 下载

浅谈Java设计模式(十)桥接模式(Bridge)

前言: 桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接...
  • caihongdao123
  • caihongdao123
  • 2016-07-11 09:49:33
  • 8958

浅谈JAVA设计模式之——桥接模式(Bridge)

一、概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 二、适用性 1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者...
  • l1028386804
  • l1028386804
  • 2015-05-03 12:25:34
  • 5836

菜鸟版JAVA设计模式-从抽象与实现说桥接模式

桥接模式,初学的时候其实很不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到。其实我学习是一件比较痛苦的事情,因为我必须要知道来龙去脉才能学的进去,所以,很快我就对这个命名产生了兴趣,桥接? 嗯...
  • lulei9876
  • lulei9876
  • 2014-10-22 15:26:41
  • 2247

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

桥接模式 (Bridge) 一、定义 二、结构 三、具体案例 1.传统方法 2.使用桥接模式 四、应用场景 一、定义将抽象部分与实现(行为...
  • tanggao1314
  • tanggao1314
  • 2016-01-30 17:37:17
  • 929

java/android 设计模式学习笔记(8)---桥接模式

这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一。桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分...
  • zhao_zepeng
  • zhao_zepeng
  • 2016-06-10 19:59:10
  • 8487

策略模式和桥接模式的区别。

策略模式: 设计一个接口或者抽象类。 public interface Employment{ public void work();} 多种具体实现: public class E...
  • a990924291
  • a990924291
  • 2016-02-06 09:40:01
  • 860

java 桥接模式

http://blog.chinaunix.net/uid-618047-id-2086001.html   java 桥接模式 (2009-01-23 11:10) 分类: java...
  • MZYang272
  • MZYang272
  • 2012-12-18 15:36:18
  • 920
收藏助手
不良信息举报
您举报文章:Java实现桥接模式
举报原因:
原因补充:

(最多只允许输入30个字)