Java記述設計モード(08):ブリッジモード


一、ブリッジモードの概要
1、基礎説明
ブリッジモードはオブジェクトの構造モードです.ハンドル(Handle and Body)モードまたはインターフェース(Interface)モードとも呼ばれる.ブリッジモードは「抽象化(Abstraaction)とインプリメンテーション(Implementation)を脱結合し、両者を独立に変化させる」ことを意図している.
2、シーン問題の説明
1)、シーン分析
複雑なシステムでは、メッセージ通知は必須モジュールであり、一般的なパッケージ方式は主に次の2つの方法から着手します.
  • メッセージタイプ
  •      (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)ロール
  • 抽象化ロールを拡張し、修正親クラスの抽象化の定義を変更します.
  • インプリメンテーションロール
  • このロールは、キャラクタを実装するインタフェースを与えるが、具体的な実装は与えない.
  • 具現化(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
        :    
    https://gitee.com/cicadasmile/model-arithmetic-parent