Structural Patterns Part 2/7: Bridge Pattern

来源:互联网 发布:石膏板隔音墙数据 编辑:程序博客网 时间:2024/05/29 16:32

Structural Patterns Part 2/7: Bridge Pattern

目录

    • Structural Patterns Part 27 Bridge Pattern
    • 目录
    • Definition
    • UML Class Diagram
    • Implementation


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.javapackage designpatternsstructuralpatterns.bridge;import java.util.List;public interface HeadSet {    void play(List<String> songs);}// HeadSetImpl.javapackage 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.javapackage 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);    }   }// outputThe WiredHeadSet is Playing: [I want it that way][Bye bye bye][Flying without wings]WiredHeadSet >>>>>>> BluetoothHeadSetThe BluetoothHeadSet is Playing: [I want it that way][Bye bye bye][Flying without wings]
0 0