桥接模式--将抽象和实现变化分离

原创 2016年08月29日 10:51:05

1)概述
桥接模式又称柄体(Handle and body)模式或者接口(Interface)模式。将抽象部分和实现部分部分脱耦,使两部分可以独立的变化。抽象类和实现类之间使用组合/聚合而不是继承关系,设计更有扩展性,客户端调用时不用知道实现的细节。
相似场景:家兴最近开发一款新的游戏,公司分配任务的是让他开发各种角色的基本功能,例如LOL的肉盾和法师之类的角色,同时呢,这些角色拥有基本的行动功能,走路,跳跃,放技能等等;家兴马上对这些代码进行开发,他马上用一个继承方式来实现,角色为父类,然后肉盾,法师为继承角色,之后走路,跳跃,放技能再继承其中的肉盾,法师;一开始的角色少的时候,反而没有发现问题,后来增多几个角色或技能的时候发现类增加也很多,成子类爆炸式增长,耦合性增大。家兴在想该怎么去解决这样一个问题呢?

2)解决方案
分析:对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类的发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或其它更适合的类替换。这种依赖的关系限制了灵活性并限制了复用性,针对这个问题,提出了通过聚合或组合去实现需求,以桥接模式去实现。
重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。

3)结构
Action:抽象类动作类,维护一个Role的对象,聚合关系;
Walk:继承抽象类Action,走路动作的类,修正抽象类化角色。扩充由Action定义的接口
Jump:继承抽象类Action,跳的动作的类,修正抽象类化角色。扩充由Action定义的接口
PullSkill:继承抽象类Action,放技能动作的类,修正抽象类化角色。扩充由Action定义的接口
Role:角色接口,实现化角色。定义实现类的接口,这个接口不一定要与Action类完全一致。一般Role提供基本操作,
Action可能做更多更复杂的操作。
Epimatium:实现Role接口的肉盾类,进行具体实现操作等。
Master:实现Role接口的法师类,进行具体实现操作等。

4.桥接模式的XML图
这里写图片描述

5.代码实现

//Action抽象类
public abstract class Action {
    protected Role role;
    public void setRole(Role role){
        this.role = role;
    }

    public abstract void diIt();

}
//walk类
public class Walk extends Action{

    @Override
    public void diIt() {
        // TODO Auto-generated method stub
        this.role.doSomeThing();
        System.out.println("我要走路了");
    }
}
//jump类
public class Jump extends Action{

    @Override
    public void diIt() {
        // TODO Auto-generated method stub
        this.role.doSomeThing();
        System.out.println("我要跳了");
    }
}
//pullSkill类
public class PullSkill extends Action{

    @Override
    public void diIt() {
        // TODO Auto-generated method stub
        this.role.doSomeThing();
        System.out.println("我要放技能");
    }
}
//Role接口
public interface Role {
    public void doSomeThing();

}
//Epimatium 
public class Epimatium implements Role{

    @Override
    public void doSomeThing() {
        // TODO Auto-generated method stub
        System.out.println("我是肉盾角色:");
    }
}
//Master 类
public class Master implements Role{

    @Override
    public void doSomeThing() {
        // TODO Auto-generated method stub
        System.out.println("我是法师角色:");
    }
}

//客户端
public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Role role = new Epimatium();
        Action walk = new Walk();
        walk.setRole(role);
        walk.diIt();

        Role role1 = new Master();
        Action jump = new Jump();
        jump.setRole(role1);
        jump.diIt();

        Action skill = new PullSkill();
        skill.setRole(role1);
        skill.diIt();
    }
}

程序输出结果:
我是肉盾角色:
我要走路了
我是法师角色:
我要跳了
我是法师角色:
我要放技能

6)分析结果
实现系统有可能更多的角度分类,每一种分类都有可能变化,就把这种多角度分离出来让它们独立变化,减少他们之间的耦合。如上面的动作等等

7)合成/聚合复用原则
合成/聚合复用原则,尽量使用合成/聚合,尽量不要使用类继承。
合成和聚合都是关联特殊种类。聚合表示一种弱拥有关系,体现的事A对象包含B对象,但B对象不是A对象的一部分;合成则是一种强拥有的关系,体现严格的整体和部分的关系,部分和整体的生命周期都是一样。
合成/聚合复用原则的好处是:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集合中在单个任务上。这个类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

8)与其它模式之间的关联
1.抽象工厂模式
Factory 模式可以用来创建和配置一个特定的Bridge模式。
2.适配器模式
适配器模式使用一般是在系统开发完成后,由于被适配者不能使用,进行适配改动去使用。桥接模式一般是在系统在开发初期进行设计。
3.装饰模式
这两种模式都是避免继承导致子类过多才使用的,但是他们解决的问题不同,装饰模式是不在一个同层次上实现,而桥接模式则把原来的基类的实现化细节抽象出来,在构造到一个实现化的结构中,然后再把原来的基类改造

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式拾荒之桥接模式( Bridge Pattern ): 可以变化的抽象类与接口

参考书籍: 《Design Patterns: Elements of Reusable Object-Oriented Software》 Beidge pattern - Wiki 桥接模式是一...

结构型模式之——桥接模式

创建型模式之 桥接模式 爱看不看 模式定义 模式结构 清明上河图 高清有码 输出 总结 感谢创建型模式之 桥接模式爱看不看设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,这时如果绘制的...

基于WebService的样方分析设计与实现

本科毕设做的是样方分析的web服务设计与实现,这篇博客我主要j

VS2008工程中 附加依赖项 和 附加库目录

转载地址:http://www.cnblogs.com/MuyouSome/p/3380134.html 附加依赖项 是指输入项,如某个.LIB文件。 附加库目录 是你用 #pragma c...

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

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

处理多维度变化——桥接模式(二)

10.2 桥接模式概述         桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一...
  • LoveLion
  • LoveLion
  • 2012年04月16日 00:07
  • 13051

处理多维度变化——桥接模式(三)

为了减少所需生成的子类数目,实现将操作系统和图像文件格式两个维度分离,使它们可以独立改变,Sunny公司开发人员使用桥接模式来重构跨平台图像浏览系统的设计,其基本结构如图10-5所示:     ...
  • csdn_ds
  • csdn_ds
  • 2017年11月13日 10:17
  • 21

处理多维度变化--桥接模式Bridge

概述:在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就...

桥接模式(Bridge Pattern)——处理多维度变化

前言P: 嘿,小重楼!我们这边有个简单的需求,交个你了。me: 啥需求?我拒绝!!!P: 呀?你小子敢拒绝老娘的需求,活腻了吧?me: 好吧,我接。。。做啥呢?我接。。。P: 我这边需要开发一个视频播...

处理多维度变化——桥接模式(一):跨平台图像浏览系统

在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如果使用毛笔的话,...
  • will130
  • will130
  • 2016年01月15日 16:20
  • 291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:桥接模式--将抽象和实现变化分离
举报原因:
原因补充:

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