zoukankan      html  css  js  c++  java
  • Java描述设计模式(08):桥接模式

    本文源码:GitHub·点这里 || GitEE·点这里

    一、桥接模式简介

    1、基础描述

    桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。

    2、场景问题描述

    1)、场景分析

    在一个复杂的系统中,消息通知是一个必备模块,一般封装方式主要从下面两个方式入手:

    • 消息类型
    用户端消息(user-client)
    管理端消息(system-client)
    
    • 消息接收
    邮件发送(email)
    短信发送(msg)
    

    2)、场景图解

    3)、源码实现

    /**
     * 桥接模式场景应用
     */
    public class C01_InScene {
        public static void main(String[] args) {
            // 创建具体的实现对象
            MsgImplementor implementor = new SendBySMS() ;
            // 创建普通的消息对象
            AbstractMsg abstractMessage = new UserMsg(implementor);
            abstractMessage.sendMessage("您的账户异地登陆", "用户A0001");
            // 切换为邮件方式且加急处理
            implementor = new SendByEmail() ;
            abstractMessage = new AdminMsg(implementor);
            abstractMessage.sendMessage("项目上线通知", "运维S0001");
        }
    }
    /**
     * 封装消息类型
     */
    abstract class AbstractMsg {
        // 持有一个实现部分的对象
        MsgImplementor impl ;
        public AbstractMsg (MsgImplementor impl){
            this.impl = impl ;
        }
        /**
         * 发送消息,委派给实现部分的方法
         * @param message    要发送消息的内容
         * @param toUser    消息的接受者
         */
        public void sendMessage (String message, String toUser){
            this.impl.send(message, toUser);
        }
    }
    class AdminMsg extends AbstractMsg{
        public AdminMsg(MsgImplementor impl) {
            super(impl);
        }
        @Override
        public void sendMessage(String message, String toUser) {
            message = "辛苦的管理员:"+message;
            super.sendMessage(message, toUser);
        }
    }
    class UserMsg extends AbstractMsg{
        public UserMsg(MsgImplementor impl) {
            super(impl);
        }
        @Override
        public void sendMessage(String message, String toUser) {
            message = "尊敬的用户:" + message ;
            super.sendMessage(message, toUser);
        }
    }
    
    /**
     * 封装消息发送
     */
    interface MsgImplementor {
        void send (String message , String toUser) ;
    }
    class SendBySMS implements MsgImplementor{
        @Override
        public void send(String message, String toUser) {
            System.out.println("短信通知:"+toUser+";内容:"+message);
        }
    }
    class SendByEmail implements MsgImplementor{
        @Override
        public void send(String message, String toUser) {
            System.out.println("邮件通知:"+toUser+";内容:"+message);
        }
    }
    

    二、桥接模式

    1、模式图解

    2、核心角色

    • 抽象化(Abstraction)角色

    抽象化给出的定义,并保存一个对实现化对象的引用。

    • 修正抽象化(RefinedAbstraction)角色

    扩展抽象化角色,改变修正父类对抽象化的定义。

    • 实现化(Implementor)角色

    这个角色给出实现化角色的接口,但不给出具体的实现。

    • 具体实现化(ConcreteImplementor)角色

    这个角色给出实现化角色接口的具体实现。

    3、源码封装

    abstract class Abstraction {
        private Implementor implementor  ;
        public Abstraction (Implementor implementor){
            this.implementor = implementor ;
        }
        // 实例方法
        public void operation (){
            implementor.operationImpl();
        }
    }
    class RefinedAbstraction extends Abstraction{
        public RefinedAbstraction(Implementor implementor) {
            super(implementor);
        }
        //其他的操作方法
        public void otherOperation(){
        }
    }
    abstract class Implementor {
        // 示例方法,实现抽象部分需要的某些具体功能
        public abstract void operationImpl () ;
    }
    class ConcreteImplementorA extends Implementor{
        @Override
        public void operationImpl() {
            System.out.println("ConcreteImplementorA.operationImpl()");
        }
    }
    class ConcreteImplementorB extends Implementor{
        @Override
        public void operationImpl() {
            System.out.println("ConcreteImplementorB.operationImpl()");
        }
    }
    

    三、Java应用场景

    桥梁模式在Java应用中的一个非常典型的例子就是JDBC驱动器。抽象API可以对各种数据库引擎发出SQL指令,并不直接与数据库引擎互动,JDBC驱动器负责这个底层的工作。

    JDBC的这种架构,把抽象部分和具体部分分离开来,从而使得抽象部分和具体部分都可以独立地扩展。

    四、源代码地址

    GitHub·地址
    https://github.com/cicadasmile/model-arithmetic-parent
    GitEE·地址
    https://gitee.com/cicadasmile/model-arithmetic-parent
    

  • 相关阅读:
    海量数据中,寻找最小的k个数。
    快速排序
    反转一个单链表,分别以迭代和递归的形式来实现
    N个大小不等的自然数排序,时间复杂度为O(n),空间复杂度为O(1)
    堆排序
    两个已经排好序的链表合并为一个有序链表
    字符串过滤空格、回车、tab
    求一个浮点数的连续子序列最大乘积 (2013 小米校园招聘笔试题)
    单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列
    给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/11397804.html
Copyright © 2011-2022 走看看