Structural Patterns Part 2/7: Bridge Pattern

Structural Patterns Part 2/7: Bridge Pattern

目录


Definition

Bridge Pattern是分离抽象和接口的模式,这样抽象的实现类就不用与接口紧密的耦合在一起了。

一句话:
Decouple an abstraction from its implementation so that the two can vary independently.

何时使用?当希望分离抽象类的接口和抽象类的具体实现类时。

使用频率:Frequency of use Medium


UML Class Diagram

Bridge Pattern


Implementation

Phone类想要实现HeadSet接口从而达到可以听歌的效果。
这里就可以看出,抽象类Phone的具体实现类MOTO已经完全与HeadSet接口的实现类分离开来。
接口中的方法再也不用渗入到类里了。
MOTO既可以用 WiredHeadSet 来听歌,也可以随时切换到BluetoothHeadSet来听歌。

// HeadSet.java
package designpatternsstructuralpatterns.bridge;

import java.util.List;

public interface HeadSet {
    void play(List<String> songs);
}

// HeadSetImpl.java
package designpatternsstructuralpatterns.bridge;

import java.util.List;

class WiredHeadSet implements HeadSet {

    @Override
    public void play(List<String> songs) {
        System.out.println("The WiredHeadSet is Playing: ");
        for(String song: songs) {
            System.out.println("[" + song + "]");
        }
    }
}

class BluetoothHeadSet implements HeadSet {

    @Override
    public void play(List<String> songs) {
        System.out.println("The BluetoothHeadSet is Playing: ");
        for(String song: songs) {
            System.out.println("[" + song + "]");
        }
    }
}

// BridgeDemo.java
package designpatternsstructuralpatterns.bridge;

import java.util.*;

public class BridgeDemo {
    public static void main(String[] args) {
        List<String> songs = new ArrayList<>();
        songs.add("I want it that way");
        songs.add("Bye bye bye");
        songs.add("Flying without wings");

        Phone phone = new MOTO(songs);
        phone.setHs(new WiredHeadSet());
        phone.listen();

        System.out.println();
        System.out.println("WiredHeadSet >>>>>>> BluetoothHeadSet");
        System.out.println();

        phone.setHs(new BluetoothHeadSet());
        phone.listen();     
    }
}

abstract class Phone {  
    protected HeadSet hs;

    public HeadSet getHs() {
        return hs;
    }

    public void setHs(HeadSet hs) {
        this.hs = hs;
    }

    abstract void listen();
}

class MOTO extends Phone {
    private List<String> songs;

    public MOTO(List<String> songs) {
        this.songs = songs;
    }   

    @Override
    void listen() {
        hs.play(songs);
    }   
}

// output
The WiredHeadSet is Playing: 
[I want it that way]
[Bye bye bye]
[Flying without wings]

WiredHeadSet >>>>>>> BluetoothHeadSet

The BluetoothHeadSet is Playing: 
[I want it that way]
[Bye bye bye]
[Flying without wings]
posted @ 2016-06-02 13:41  1202zhyl  阅读(127)  评论(0编辑  收藏  举报