桥接模式

1.桥接模式概念

在《Head First Design Patterns》文中是这么介绍桥接模式的,“不仅可以改变你的实现,也可以改变你的抽象”。这句话说得一头雾水,这里的实现和抽象指的是什么呢?下面会通过例子来解释。

2.桥接模式的作用

把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

3.使用场景

实现系统可能有多个角度分类,每一种角度都可能变化。说实话,我不懂怎么总结,只能通过例子来说明。

4.优点和缺点

优点
1、抽象和实现的分离,不会互相影响。
2、对于具体的抽象类的修改,不会影响到客户。
缺点
增加系统的理解与设计难度。

5.例子解析

桥接模式例子解析类图

这是一个遥控器和TV的例子。遥控器控制TV,不同的遥控器控制不同的TV.
遥控器抽象类(这个类可以是抽象类或者是接口)

package com.lgy.test;

/**
 * @author LGY
 * 把抽象化与实现化解耦,使得二者可以独立变化。这句化还真不好理解。我自己理解是这样的就以遥控器和TV来解释。
 * 不同的遥控器控制不同的TV。这里遥控器和TV都有可能发生变化,为了实现解耦,最好就是能将她们分开,独立让他们变化。
 * 但是这里的抽象化和实现化指的是啥?就本例来说,抽象化指的是遥控器,实现化指的是TV.只要我们能够区分是谁控制谁就很好理解了
 * 这里很明显是遥控器控制TV.而且代码中也很明显,RemoteControl和TV的关系是RemoteControl Has-a TV的关系
 */
public abstract class RemoteControl {

    TV imprementor;
    
    public RemoteControl(TV imprementor) {
        this.imprementor = imprementor;
    }
    abstract void on();
    abstract void off();
    public void setChannel(int station)
    {
        imprementor.tuneChannel(station);
    }
}

遥控器具体实现类

package com.lgy.test;

public class ConcrateRemote extends RemoteControl{

    public ConcrateRemote(TV imprementor) {
        super(imprementor);
    }
    private int currentStation;
    
    @Override
    void on() {
        imprementor.on();
    }

    @Override
    void off() {
        imprementor.off();
    }

    public void setStation(int station) {
        this.currentStation = station;
    }
    
    public void nextChannel() {
        setStation(currentStation+1);
        setChannel(currentStation);
    }
    public void previousChannel() {
        setStation(currentStation-1);
        setChannel(currentStation);

    }
}

TV接口

package com.lgy.test;

public interface TV {

    void on();
    void off();
    void tuneChannel(int station);
}

TV具体类:RCA

package com.lgy.test;

public class RCA implements TV{

    @Override
    public void on() {
        System.out.println("RCA ON");
    }

    @Override
    public void off() {
        System.out.println("RCA OFF");
    }

    @Override
    public void tuneChannel(int station) {
        System.out.println("RCA current station "+station);
    }
}

TV具体类:Sony

package com.lgy.test;

public class Sony implements TV{

    @Override
    public void on() {
        System.out.println("Sony ON");
    }

    @Override
    public void off() {
        System.out.println("Sony OFF");
    }

    @Override
    public void tuneChannel(int station) {
        System.out.println("Sony current station "+station);
    }
}

客户端:

package com.lgy.test;

public class Client {

    public static void main(String[] args) {
        TV tv = new RCA();
        ConcrateRemote concrateRemote = new ConcrateRemote(tv);
        concrateRemote.on();
        concrateRemote.nextChannel();
        concrateRemote.nextChannel();
        concrateRemote.nextChannel();
        concrateRemote.nextChannel();
        concrateRemote.previousChannel();

        concrateRemote.off();
    }
}

6.总结

把抽象化与实现化解耦,使得二者可以独立变化。这句化还真不好理解。我自己理解是这样的,就以遥控器和TV来解释。不同的遥控器控制不同的TV。这里遥控器和TV都有可能发生变化,为了实现解耦,最好就是能将她们分开,独立让他们变化。但是这里的抽象化和实现化指的是啥?就本例来说,抽象化指的是遥控器,实现化指的是TV.只要我们能够区分是谁控制谁就很好理解了,这里很明显是遥控器控制TV.而且代码中也很明显,RemoteControl和TV的关系是RemoteControl Has-a TV的关系。

7.源码地址

http://download.csdn.net/download/lgywsdy/9981845

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 发送提示消息## 考虑这样一个实际的业务功能:发送提示消息。基本上所有带业务流程处理的系统...
    七寸知架构阅读 5,102评论 5 63
  • 本文参考:http://www.oschina.net/question/1436074_140456 http:...
    端木轩阅读 3,629评论 0 5
  • 在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够...
    justCode_阅读 1,805评论 0 7
  • 概念 桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。...
    今晚打肉山阅读 325评论 0 1
  • 这次是第二次来成都,上次来成都还是2010年.两次来各有各的印象,可能和来的目的、住的地方、接触的人以及吃的食物有...
    瘦成闪电666阅读 263评论 0 0