桥梁模式及实例:上课

桥梁模式及实例:上课

将抽象和实现解耦,使得两者可以独立地变化。

桥梁模式及实例:上课_第1张图片

两个纬度上的,都可单独的变化

桥梁模式的角色

  • Abstraction 抽象化角色
    • 定义出该角色行为
    • 保存一个Implements的引用
  • Implements 实例化角色
    • 定义出该角色的行为和属性
  • RefineAbstraction 修正抽象化角色
    • 修正抽象化角色的行为和属性
  • ConcreteImplements 具体实例化角色
    • 实现Implements

UML

桥梁模式及实例:上课_第2张图片

优点

  • 抽象和实现分离
  • 优秀的扩展能力
  • 实现细节对客户透明

使用场景

对于比较明确不发生变化的,通过继承来完成,若不能确定是否会发生变化的,那就认为是会发生变化,通过桥梁模式来解决。

实例:上课

首先,定义Implements

抽象的学科类

/**
 * 学科
 * <p/>
 * Created by EthanCo on 2016/1/8.
 */
public abstract class Subject {
    public abstract void showKnowledge();
}

实现具体的Implements

数学课

/**
 * 数学
 * <p/>
 * Created by EthanCo on 2016/1/8.
 */
public class Math extends Subject {

    @Override
    public void showKnowledge() {
        Log.i("zhk-Math", " 1 + 2 = 3 ");
    }
}

C语言课

/**
 * C语言
 * <p/>
 * Created by EthanCo on 2016/1/8.
 */
public class CLanguage extends Subject {

    @Override
    public void showKnowledge() {
        Log.i("zhk-CLanguage", " printf(\"hello world !\");");
    }
}

定义Abstraction

抽象的老师类

/**
 * 老师
 * <p/>
 * Created by EthanCo on 2016/1/8.
 */
public abstract class Teacher {
    protected String name;

    private Subject subject;

    public Teacher(Subject _subject) {
        this.subject = _subject;
    }

    /**
     * 教学
     */
    public void teaching() {
        subject.showKnowledge();
    }
}

修正Abstraction的行为

极致教学的朱老师

/**
 * 朱老师
 * <p/>
 * Created by EthanCo on 2016/1/8.
 */
public class TeacherZhu extends Teacher {
    public TeacherZhu(Subject _subject) {
        super(_subject);
        name = "朱老师";
    }

    @Override
    public void teaching() {
        Log.i("zhk-TeacherZhu", name + "极致地教学");
        super.teaching();
    }
}

外聘的老师

/**
 * 外聘的教师
 * <p/>
 * Created by EthanCo on 2016/1/8.
 */
public class TeacherTemp extends Teacher {

    public TeacherTemp(Subject _subject) {
        super(_subject);
        name = "不知道姓名的老师";
    }

    @Override
    public void teaching() {
        Log.i("zhk-TeacherTemp", name + "不知所云地教学");
        Log.i("zhk-TeacherTemp", "@$##@&(#@$&(#&@!)(#)(@!#");
        //super.teaching();
    }
}

在Client中调用

Log.i("zhk-MainActivity", "================= C语言课 ================");
Subject cLanguage = new CLanguage();
Teacher cTeacher = new TeacherZhu(cLanguage);
cTeacher.teaching();

Log.i("zhk-MainActivity", "================= 数学课 ====================");
Subject math = new Math();
Teacher mathTeacher = new TeacherTemp(math);
mathTeacher.teaching();

输出结果
================= C语言课 ================
朱老师极致地教学
printf(“hello world !”);
================= 数学课 ====================
不知道姓名的老师不知所云地教学
@##@&(#@&(#&@!)(#)(@!#

由于外聘老师教的实在太差,所以学校决定让李老师来教数学 ###

新建李老师类

/**
 * 李老师
 * <p/>
 * Created by EthanCo on 2016/1/8.
 */
public class TeacherLi extends Teacher {
    public TeacherLi(Subject _subject) {
        super(_subject);
        name = "李老师";
    }

    @Override
    public void teaching() {
        Log.i("zhk-TeacherLi", name + "优雅地教学");
        super.teaching();
    }
}

在Client中进行替换

Teacher mathTeacher = new TeacherTemp(math);

Teacher mathTeacher = new TeacherLi(math);

输出结果
================= C语言课 ================
朱老师极致地教学
printf(“hello world !”);
================= 数学课 ====================
不知道姓名的老师不知所云地教学
1 + 2 = 3

由于朱老师教我们C语言很好,第二学期继续教我们Java

新建Java语言学科

/**
 * Java语言
 * <p/>
 * Created by EthanCo on 2016/1/8.
 */
public class JavaLanguage extends Subject {
    @Override
    public void showKnowledge() {
        Log.i("zhk-JavaLanguage", "List<String> list = new ArrayList<String>();");
    }
}

在Client中添加

    Log.i("zhk-MainActivity", "=================== Java语言课 =================");
    Subject javaLanguage = new JavaLanguage();
    Teacher javaTeacher = new TeacherZhu(javaLanguage);
    javaTeacher.teaching();

输出结果
================= C语言课 ================
朱老师极致地教学
printf(“hello world !”);
================= 数学课 ====================
不知道姓名的老师不知所云地教学
1 + 2 = 3
=================== Java语言课 =================
朱老师极致地教学
List list = new ArrayList();

#

可以发现,桥梁模式在两个纬度上的扩展,非常容易,且只需修改Client,非常的方便。

源码

相关源码

参考

《设计模式之禅第二版》

你可能感兴趣的:(java,android,桥接模式,桥梁模式,桥模式)