【2013.1.22】爱因斯坦和爱他的小板凳——Bridge
来源:互联网 发布:krpano全景源码 编辑:程序博客网 时间:2024/04/19 10:33
// // // // // // // // //
///2013.1.22
// // // // // // // // //
老师布置了一项作业,
——制作一个小板凳。
被誉为天才的舒马赫同学很快的完成了一个又漂亮,又精致的艺术板凳。
而一直被班上同学所嘲笑的笨笨的爱因斯坦同学磨磨蹭蹭地,
转天早上才交上一个形状奇异而古怪的"小板凳"。
这是小时候看到的一篇励志故事。
不管寓意如何,
但是它正好可以适合我们今天所要讲的结构型设计模式:Bridge。
【核心】将抽象部分与它内部所组合的部分分离,使得它们可以独立地变化。
这是我将GoF的官方解释稍微变更一下所得的结论。
来看一下UML图:
其中Abstraction就是上述的抽象部分,
内部所组合的就是AbstractionImp。
实现的方法十分简单,
Abstraction内部组合一个(或多个)同学,
然后下达一个命令(例如老师布置制作小板凳作业),
而具体的实现,
就看传到Abstraction构造函数里面的是舒马赫还是爱因斯坦同学了。
这是一个非常实用的模式。
使用组合代替继承,
很好地代表了设计模式的核心思想:low coupling,high cohension.
代码实例:
【大致思路】
虚基类Student类的两个派生类分别为爱因斯坦与舒马赫,他们都拥有父类的方法:submitHomework.而另一个类Bridge类中聚合了一个Student接口,
可以通过控制在构造器中传入的实例,来显示不同同学提交的不同的作业。
Student.h
#ifndef _STUDENT_H_#define _STUDENT_H_class Student{protected:char* name;public :Student(){}Student(const Student& stu){}~Student(){}//Interfacevirtual void submitHomework() = 0;};class Einstein : public Student{protected:char* name;public:Einstein();Einstein(const Einstein& e){};~Einstein(){};void submitHomework();};class Schumacher : public Student{protected:char* name;public:Schumacher();Schumacher(const Schumacher& e){};~Schumacher(){};void submitHomework();};#endif
Student.cpp
#include "Student.h"#include<iostream>Einstein::Einstein(){name = "Einstein";}void Einstein::submitHomework(){std::cout<<name<<"'s homework: "<<"Bad Bandeng"<<std::endl;}Schumacher::Schumacher(){name = "Schumacher";}void Schumacher::submitHomework(){std::cout<<name<<"'s homework: "<<"Good Bandeng"<<std::endl;}
Bridge.h
#ifndef _TEACHER_H_#define _TEACHER_H_#include"Student.h"class Bridge{private:Student* student;public:Bridge(Student* stu);void getStudentsHomework();};#endif
Bridge.cpp
#include"Bridge.h"Bridge::Bridge(Student* stu){this->student = stu;}void Bridge::getStudentsHomework(){this->student->submitHomework();}
main.cpp
#include"Bridge.h"int main(){Student* einstein = new Einstein();Student* schumacher = new Schumacher();Bridge* bridge_1 = new Bridge(einstein);Bridge* bridge_2 = new Bridge(schumacher);bridge_1->getStudentsHomework();bridge_2->getStudentsHomework();return 0;}
输出结果:
【注意事项】
可以看到,
代码最关键的部分在于Bridge的构造函数。
最后做出什么产品与传入的制作者有关。
顺便一提,
这个模式大多用来适配软件的不同版本(凭借共同的接口)。
跑一点题,
我们每个人都有自己擅长的方向,
每个人都有属于自己的光芒。
因此没有必要为了自己不如其他人如何如何而烦恼。
抬起头来,
去寻找天空中属于自己的那一颗星。
发明相对论的不是舒马赫,
而且也别忘了,
爱因斯坦还有他的小板凳呢。
Just to be yourself.
And——
Keep moving.- 【2013.1.22】爱因斯坦和爱他的小板凳——Bridge
- 我的小板凳
- 爱因斯坦的谜语—他说98%的人答不出来
- 小板凳社区
- 分享:菜鸟的练习--我的第一个小板凳
- 我的人生观 ——爱因斯坦
- 爱因斯坦谜题(他说98%的人做不出来)
- 爱他原来的样子
- 爷爷爱他的孙子
- 《爱因斯坦死亡方程式》——一部关于爱因斯坦传奇一生的纪录片
- 2014编程之美第二题——大神和他的小伙伴
- 页面仔和他的小创新
- 红黑树和他的小伙伴们
- 蓝桥杯--小明和他的表弟
- 大爱无疆,德泰先行——刘煊苗与他的德泰堂
- 板凳
- 超越爱因斯坦 ——探索宇宙本原和人类未来
- 爱他
- JS 固定两个DIV一样高
- 荒芜
- C++回调函数封装成C#委托测试
- 网站性能优化的三重境界
- [Boost基础]函数与回调——bind绑定
- 【2013.1.22】爱因斯坦和爱他的小板凳——Bridge
- Linux下C语言结合SHELL语言实现相关命令功能
- Android中EditTex焦点设置和弹不弹出输入法的问题
- 2012年总结!
- Oracle Exists 用法
- ajaxfileupload 简单实例
- Struts 的session request application HttpServietRequest HttpSession ServietContext
- Deep learning
- linux 中的信号