桥接模式

1.桥接模式概念

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

2.桥接模式的作用

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

3.使用场景

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

4.优点和缺点

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

5.例子解析

桥接模式_第1张图片
桥接模式例子解析类图

这是一个遥控器和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

你可能感兴趣的:(桥接模式)