2015年1月30日星期五

桥接模式 - 306573704

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
桥接模式 - 306573704  阅读原文»

1.概述

  将抽象部分与实现部分脱耦,使它们都可以独立的变化。 ——《设计模式》GOF

  所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。

  桥接模式所解决的问题是将两个维度的变化分离开,使它们可以独立的变化,是采用组合的方式使两个维度联系起来。

2.优缺点

  优点
  1)将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。

  2)将可以共享的变化部分,抽离出来,减少了代码的重复信息。

  3)对象的具体实现可以更加灵活,可以满足多个因素变化的要求。

  缺点
  1)客户必须知道选择哪一种类型的实现。

3.与继承的比较

  待补充。

4.策略模式、建造者模式、桥接模式的比较

  如果不考虑使用场景,单从实现过程来看,桥接模式是策略模式的横向扩展,即维度扩展,如软件维度增加一个手机维度;建造者模式是策略模式的纵向扩展,即增加了一个层次,如软件维度分解成不同的流程,由一个类统一调度。

  PS:求喷~

5.策略模式与建造者模式比较代码

  待补充。

6.桥接模式与策略模式的比较代码

  《大话设计模式C++版》中以手机和软件为例描述了桥接模式。我们先用策略模式来实现一种手机上安装不同软件。

1 #include <iostream>
2 #include <string>
3 #include <vector>
4 using namespace std;
5
6 //手机软件
7 class HandsetSoft
8 {
9 public:
10 virtual void Run()=0;
11 };
12
13 //游戏软件
14 class HandsetGame : public HandsetSoft
15 {
16 public:
17 virtual void Run()
18 {
19 cout<<"运行手机游戏"<<endl;
20 }
21 };
22
23 //通讯录软件
24 class HandSetAddressList : public HandsetSoft
25 {
26 public:
27 virtual void Run()
28 {
29 cout<<"手机通讯录"<<endl;
30 }
31 };
32
33 //手机
34 class Handset
35 {
36 protected:
37 HandsetSoft* m_soft;
38 public:
39 void SetHandsetSoft(HandsetSoft* temp)
40 {
41 m_soft = temp;
42 }
43 virtual void Run()
44 {
45 m_soft->Run();
46 }
47 };
48
49
50 //客户端
51 int main()
52 {
53 Handset *brand = new HandSet();
54 brand->SetHandsetSoft(new HandsetGame());
55 brand->run();
56
57 return 0;
58 }

  再将手机加上品牌这一维度:

1 #include <iostream>
2 #include <string>
3 #include <vector>
4 using namespace std;
5
6 //手机软件
7 class HandsetSoft
8 {
9 public:
10 virtual void Run()=
bb_black_学习笔记――(4)闪烁LED之shell命令 - lizhezhe  阅读原文»

上一篇笔记在终端输入shell命令实现了LED灯的点亮与熄灭,作为初学者,已经兴奋了一阵,因为终于有了零的突破。手动点亮LED总会比较麻烦,还是得通过程序让它自己去点亮与熄灭,这样才更好玩。这篇笔记里,笔者通过学习shell脚本,实现LED的闪烁,这样才好玩。本篇笔记还是先从现象看起,然后在分析其实现原理。

第一步:实现LED灯闪烁

1、先来个简单的shell脚本,了解一下shell脚本的使用流程。下图为创建一个名为hello_sh的shell脚本编辑执行的过程。

clipboard[5]

几点说明:

(1)shell脚本可以没有文件后缀名,但是为了方便,也可以添加.sh为其后缀。上图中用_sh作为表示,也可以没有;

(2)shell脚本创建可以利用touch filename的形式来创建;

(3)编辑shell脚本可以直接使用vi编辑器,关于vi编辑器的简单实用请查看上一篇笔记;

(4)shell脚本是不需要编译就可以运行,有shell解释器完成命令的解读与执行;

(5)新建的shell脚本需要为其添加可执行权限,否则执行时会出错;

(6)运行shell脚本直接使用 ./* 就可以运行;

(7)上图中hello_sh脚本文件里只有一行内容,目的是输出hello字符,脚本内容如下图。

image

2、下面就进入今天的主题,首先还是要手动创建shell脚本文件,笔者的文件名为led_sh。创建和添加权限的过程就不在此贴了,请参考上文。下面直接贴出led_sh的内容。

image

几点说明:

(1)有关shell的详细使用,请参考这个链接http://c.biancheng.net/cpp/shell/。这个网站有精简的shell教程,对于初学者来说入门还是挺快的;

(2)简答解释一下脚本内容:

1)第1行:在终端显示hello led一串字符;

2)第2~4行:这部分是一个if语句,目的是查看是否有gpio44文件,如果没有,通过第3行脚本添加一个;

3)第4行:为gpio44添加输出属性;

4)第7~13行:这部分是一个while语句,在while语句里面先点亮LED,然后睡眠0.25秒再熄灭LED,再睡眠0.25秒。如此不停的循环。

5)第14行:关闭LED灯。

3、通过vi编辑器输入上面的脚本,然后运行,就可以看到LED灯闪烁的状态了。现象和上一篇笔记是一样的,不过这次直接运行脚本就可以实现不断的闪烁了。

clipboard[7]clipboard[9]

第二步:学习简单的shell脚本

1、echo用法上一篇笔记已经说明,此处不再说明。

2、if用法。

if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。if语句有三种用法,这里只说明最简单的一种语法,if ... else 语句:

1 if [ expression ] then
2 Statement(s) to be executed if expression is true
3 fi

几点说明:

(1)如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。

(2)最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写。

(3)expression 和方括号([ ])之间必须有空格,否则会有语法错误。

3、while用法。

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while command
do Statement(s) to be executed if command is true
done

几点说明:

(1)命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假,否则不退出;

(2)循环体的内容包含在do……done之间。


本文链接:bb_black_学习笔记――(4)闪烁LED之shell命令,转载请注明。

阅读更多内容

没有评论:

发表评论