博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式梳理——桥接模式
阅读量:4096 次
发布时间:2019-05-25

本文共 3637 字,大约阅读时间需要 12 分钟。

一、概述

       桥接模式(Bridge),将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。最大特点就是聚合关系在桥梁里面,具体的业务逻辑由子类完成。

二、UML图示

三、代码实现

1、Implementor类

public abstract class Implementor {    public abstract void operation();}

2、Implementor具体实现类

public class ConcreteImplementorA extends Implementor {    @Override    public void operation() {        System.out.println("实现A的方法执行!");    }}public class ConcreteImplementorB extends Implementor {    @Override    public void operation() {        System.out.println("实现B的方法执行!");    }}

3、Abstraction桥梁类

public abstract class Abstration {    protected Implementor implementor;    public Implementor getImplementor() {        return implementor;    }    public void setImplementor(Implementor implementor) {        this.implementor = implementor;    }    public abstract void operation();}

4、RefinedAbstraction类

public class RefinedAbstration extends Abstration {    @Override    public void operation(){        implementor.operation();    }}

5、测试类

public class Test {    public static void main(String[] args) {        Abstration abstration = new RefinedAbstration();        abstration.setImplementor(new ConcreteImplementorA());        abstration.operation();        abstration.setImplementor(new ConcreteImplementorB());        abstration.operation();    }}输出:实现A的方法执行!实现B的方法执行!

四、事例

比如我们在饮品点买饮品,除开要买什么饮品,还有大杯、中杯、小杯,加冰和不加冰,那么我们用代码来实现一下.

建立抽象部分:这里将饮品定位抽象,持有杯抽象和加冰抽象

/** * 先定义抽象的饮品,这里指代饮品类型 */public abstract class AbsBriageAction {    /**     * 持有杯大小引用     */    private ICup iCup;    /**     * 持有加冰不加冰引用     */    private IIce iIce;    /**     * 具体的饮品由子类去实现     */    abstract void makeDrinks();    public void setiCup(ICup iCup) {        this.iCup = iCup;    }    public void setiIce(IIce iIce) {        this.iIce = iIce;    }    protected String getiCup() {        return this.iCup.getCup();    }    protected String getiIce() {        return iIce.getIce();    }}/** * 饮品的大小杯抽象 */public interface ICup {    /**     * 获取大杯还是小杯     *     * @return 大杯或小杯     */    String getCup();}/** * 饮品加冰或不加冰抽象 */public interface IIce {    /**     * 加冰和不加冰     *     * @return 加冰或不加冰     */    String getIce();}

实现大小杯和加冰不加冰:继承杯抽象和加不加冰抽象

/** * 大杯 */public class BigCup implements ICup {    @Override    public String getCup() {        return "大杯";    }}/** * 小杯 */public class SmallCup implements ICup {    @Override    public String getCup() {        return "小杯";    }}/** * 加冰 */public class AddIce implements IIce {    @Override    public String getIce() {        return "加冰";    }}/** * 不加冰 */public class NoIce implements IIce {    @Override    public String getIce() {        return "不加冰";    }}

在看看具体抽象:这里用橙汁和百香果汁

/** * 橙汁 */public class OringeDrinks extends AbsBriageAction {    @Override    void makeDrinks() {        System.out.println("橙汁" + getiCup() + getiIce());    }}/** * 百香果饮品 */public class PassionFruitDrinks extends AbsBriageAction {    @Override    void makeDrinks() {        System.out.println("百香果" + getiCup() + getiIce());    }}

测试类:

public static void main(String[] args) {        //橙汁大杯加糖        AbsBriageAction absBriageAction = new OringeDrinks();        ICup bigCup = new BigCup();        IIce addIce = new AddIce();        absBriageAction.setiCup(bigCup);        absBriageAction.setiIce(addIce);        absBriageAction.makeDrinks();        //百香果小杯不加糖        AbsBriageAction passionFruit = new PassionFruitDrinks();        ICup smallCup = new SmallCup();        IIce noIce = new NoIce();        passionFruit.setiCup(smallCup);        passionFruit.setiIce(noIce);        passionFruit.makeDrinks();    }输出:橙汁大杯加冰百香果小杯不加冰类似UML中的,通过

饮品抽象中的持有大小杯与加冰抽象,在抽象层建立联系,使得他们三者都可以独立进行变化。

注:参考文献《大话设计模式》程杰著。

 

 
你可能感兴趣的文章
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
数据结构之单链表——C++模板类实现
查看>>
Linux的SOCKET编程 简单演示
查看>>
正则匹配函数
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
聊聊gcc参数中的-I, -L和-l
查看>>
[C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux select TCP并发服务器与客户端编程
查看>>
Linux系统编程——线程池
查看>>