桥梁模式及实例:上课
来源:互联网 发布:十字绣制作软件 编辑:程序博客网 时间: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,非常的方便。
源码
相关源码
参考
《设计模式之禅第二版》
- 桥梁模式及实例:上课
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 桥梁模式
- 【视频】Excel2013十大企业级明星函数视频课程【精讲】
- Android Studio初体验(快捷键)
- 开源框架SDWebImage的基本实现及思想
- Integer缓存分析
- 我的面试
- 桥梁模式及实例:上课
- How to get the query string by javascript?
- Java基础复习一之多线程(并发,内存模型)
- 剑指offer-重建二叉树
- Handler4
- 关于UIView类的frame属性和bounds属性的origin点的区别
- How to get the query string by javascript?
- gihubt学习记录(一)----忽略文件
- ubuntu在python3和python2之间切换