美文网首页
设计模式-桥接模式(六)

设计模式-桥接模式(六)

作者: 巨子联盟 | 来源:发表于2018-05-22 19:48 被阅读0次

    桥接模式 也称 桥梁模式

    • 用意:

    抽象化实现化 脱耦,使得二者可以独立地变化
    一个软件系统中抽象化与实现化之间使用组合/聚合的关系,而非继承的关系,从而使两者可以独立的变化

    一般地,一个抽象对应多个实现,也就是一个接口有多个实现类,这样要换不同的实现的时候就很方便了,


    image.png

    但是当抽象也是变化点的时候该怎么办呢?

    image.png

    如果用继承的方法,我们可以想象一下,这会导致更多的类出来,条理不清晰,并且抽象或者实现要增加一个的时候,原来的类需要修改.
    这时,我们要找出哪一个变化点是静态的关系用继承,哪一个是动态的关系,用聚合

    image.png
    • 实例代码:
    Bridge.png

    上图考虑的是下面这个场景,对于一个文字的显示Text,有粗体和斜体,同时对于不同的操作系统不同的粗体和斜体实现也不一样.

    1. 先定义一个实现的接口
    package com.byedbl.bridge;
    
    /**
     *  The Implementor
     */
    public interface TextImp  {
        void drawTextImp();
    }
    
    1. 分不同的系统有不同的实现
    package com.byedbl.bridge;
    
    /**
     *  The ConcreteImplementor
     */
    public class TextImpLinux implements TextImp {
        public TextImpLinux() {
        }
        public void drawTextImp() {
            System.out.println("The text has a Linux style !");
        }
    }
    
    package com.byedbl.bridge;
    
    /**
     *  The ConcreteImplementor
     */
    public class TextImpMac implements TextImp {
        public TextImpMac() {
        }
        public void drawTextImp() {
            System.out.println("The text has a Mac style !");
        }
    }
    
    1. 再定义一个我们需要的Text,将刚刚定义的接口聚合到这个抽象里面
    package com.byedbl.bridge;
    
    /**
     *  The Abstract of Text 
     */
    public abstract class Text  {
        public abstract void drawText(String text);
        protected TextImp getTextImp(String type) {
            if(type.equals("Mac")) {
                return new TextImpMac();
            } else if(type.equals("Linux")) {
                return new TextImpLinux();
            } else {
                return new TextImpMac();
            }
        }
    }
    
    1. 对于Text文本,本身它自己也分粗体和斜体等不同实现
    package com.byedbl.bridge;
    
    /**
     * The RefinedAbstraction
     */
    public class TextBold extends Text {
        private TextImp imp;
    
        public TextBold(String type) {
            imp = getTextImp(type);
        }
    
        public void drawText(String text) {
            System.out.println(text);
            System.out.println("The text is bold text!");
            imp.drawTextImp();
        }
    }
    
    package com.byedbl.bridge;
    
    /**
     *  The RefinedAbstraction
     */
    public class TextItalic extends Text {
        private TextImp imp;
        public TextItalic(String type) {
            imp = getTextImp(type);
        }
        public void drawText(String text) {
            System.out.println(text);
            System.out.println("The text is italic text!");
            imp.drawTextImp();
        }
    }
    
    1. 客户端调用
    package com.byedbl.bridge;
    
    /**
     *  <pre>
     *  A test client
     *  抽象工厂可以为桥梁模式提供产品创建的结构
     *  就是在Text类中的 getTextImp 方法可以用抽象工厂来实现
     *  形如: getTextImp(TextFactory factory) , TextFactory 就是客户端传入的抽象工厂
     *  这样,如果要加一种Text,那就只要添加一个TextXXX,
     *  如果要多支持一个操作系统也只要添加一个 TextImpWindows,和创建这个 TextImpWindows 的工厂
     *
     */
    public class Test  {
        public Test() {
        }
    
        public static void main(String[] args) {
            Text myText = new TextBold("Mac");
            myText.drawText("=== A test String ===");
    
            myText =  new TextBold("Linux");
            myText.drawText("=== A test String ===");
    
            System.out.println("------------------------------------------");
            
            myText =  new TextItalic("Mac");
            myText.drawText("=== A test String ===");
    
            myText =  new TextItalic("Linux");
            myText.drawText("=== A test String ===");
        }
    }
    

    桥接模式解决 当抽象类和实现类都要变化时的问题

    相关文章

      网友评论

          本文标题:设计模式-桥接模式(六)

          本文链接:https://www.haomeiwen.com/subject/mjckjftx.html