将抽象和实现解耦,使得两者可以独立地变化。
两个纬度上的,都可单独的变化
对于比较明确不发生变化的,通过继承来完成,若不能确定是否会发生变化的,那就认为是会发生变化,通过桥梁模式来解决。
抽象的学科类
/**
* 学科
* <p/>
* Created by EthanCo on 2016/1/8.
*/
public abstract class Subject {
public abstract void showKnowledge();
}
数学课
/**
* 数学
* <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 !\");");
}
}
抽象的老师类
/**
* 老师
* <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();
}
}
极致教学的朱老师
/**
* 朱老师
* <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();
}
}
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();
}
}
Teacher mathTeacher = new TeacherTemp(math);
Teacher mathTeacher = new TeacherLi(math);
输出结果
================= C语言课 ================
朱老师极致地教学
printf(“hello world !”);
================= 数学课 ====================
不知道姓名的老师不知所云地教学
1 + 2 = 3
/**
* 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>();");
}
}
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,非常的方便。
相关源码
《设计模式之禅第二版》