已经有很多前辈写过关于设计模式的很多经典文章,我在这里记录一些自己的学习进程,表示自己还在学习好了。
先从借来的大话设计模式看起,今天是第一章和第二章。
第一章 简单uml
uml中继承很容易记住。
说些不怎么好记住的,如 依赖 ,关联 ,聚合,组合 。
依赖用 虚线箭头表示,在代码上是类的方法用到(传入或引用)了 被依赖的类。
关联:有名的客户和订单的关系以及公司和员工的关系,都是关联关系。还有就是我和我的单车的例子,他们都是一种“拥有”的关系。表现在代码上,就是一个类包含另一个类的实例,通常表现为被关联类以类属性的形式出现在关联类的类定义中,也可以表现为关联类引用了一个类型为被关联类的全局变量。关联可以使单向的,也可以使双向的。
public class Company
{
private Employee employee;
public Employee GetEmployee()
{
return employee;
}
public void SetEmployee(Employee employee)
{
this.employee = employee;
}
//公司运作
public void Run()
{
employee.StartWorking();
}
}
聚合
聚合(aggregation)是一种特殊的联系,它表明了“部分”到“整体”的关系,显著的特点就是不能包含循环的联系(就是说,部分中不能包含整体)。如:
![uml-aac-diff-02.png uml-aac-diff-02.png](http://tech.idv2.com/wp-content/uploads/2009/04/uml-aac-diff-02.png)
{
private:
vector<Node*> itsNodes;
};
上述代码只有当子节点不会成为父节点的父节点时(即,必须是树结构,不能是图结构),才能称之为聚合。
组合
组合(composition)跟聚合几乎相同,唯一的区别就是“部分”不能脱离“整体”单独存在,就是说, “部分”的生命期不能比“整体”还要长。例如:
![uml-aac-diff-03.png uml-aac-diff-03.png](http://tech.idv2.com/wp-content/uploads/2009/04/uml-aac-diff-03.png)
class Car
{
public:
virtual ~Car() {delete itsCarb;}
private:
Carburetor* itsCarb
};
聚合和组合区别:用C++程序的话,聚合就像是类中的指针成员,而组合就是类中的成员。需要该类来创建对象。//这里说的应该不是很准确
关联与依赖的区别:有说“关联本身即是一种依赖”,亦有说“依赖是一种弱关联”,其实说来说去是一档子事。依赖和关联都是说一个类用到了另一个类。其区别在于一个是使用,一个是拥有。
关联和聚合 的区别是: 聚合是一对多的。而关联貌似是一对一的。 关联只有一个类知道另外一个类的公共属性和操作。包含了另一个对象的引用。 而聚合则是拥有被聚合类的指针,要在非成员方法里面使用。
总结一下:
依赖、关联、聚合、组合、继承、实现 耦合度依次提高。
区分心法:
1.成员变量中没有B类,方法中使用,则为依赖。
2.成员变量中有B类的引用或指针,并不参与B对象的构建,则是关联。
3.成员变量中有B类的指针,方法中使用,则是聚合关系。
4.成员变量或构造函数中有B类的实现对象,则是组合。
第二章 工厂模式和策略模式
工厂模式用到的是依赖模式的关系。
而策略模式用到的是聚合模式。
策 略模式是一种第一一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。并且继承类有助于定义一系列可供重复用的算法或行为。每个算法都有自己单独的类可以单独测试。
与工厂结合可以简化客户端,将具体的实现转移到策略模式中。