桥梁模式及实例:上课

来源:互联网 发布:十字绣制作软件 编辑:程序博客网 时间:2024/05/16 12:19

桥梁模式及实例:上课

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

桥梁模式_两个纬度

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

桥梁模式的角色

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

UML

桥梁模式

优点

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

使用场景

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

实例:上课

首先,定义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,非常的方便。

源码

相关源码

参考

《设计模式之禅第二版》

0 0
原创粉丝点击