桥梁模式及实例:上课
将抽象和实现解耦,使得两者可以独立地变化。
两个纬度上的,都可单独的变化
桥梁模式的角色
- 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,非常的方便。
源码
参考
《设计模式之禅第二版》