工厂模式(创建型模式)

应用条件:多态的创建对象。若一个类A需要创建另一个基类B的子类的对象,如果B的子类有C、D等,若在A中用new创建对象,则只能选择一个B的子类(C或D任选其1),这就与创建基类B的子类的目标相背离。

原理:组合(A中组合B的工厂基类、A中保存B子类对象的B类指针)、工厂类(B的工厂基类、C和D的工厂类)

工厂类:由于不能再类定义中自己创建自己,所以需要另一个类(工厂类)提供的一个接口来实现创建(new)该类。每一个B的子类,都有一个工厂类相对应。并且都继承只对应B的工厂基类。

应用场景举例:当不确定使用哪种数据库类型时的数据库初始化

 

抽象工厂模式(创建型模式)

应用条件:多态的创建有相关性的对象。若一个类A需要创建其他基类B1、B2、B3的子类对象时,如果B1、B2、B3的不同子类之间有相关性,则将(B1、B2、B3)的不同子类的组合再组成多个类,并抽象一个基类。

与工厂模式的区别:抽象工厂模式是工厂模式的扩展,解决了多个工厂类与工厂类之间有相关性的问题,将共性的东西抽象成一个基类而不是各自独立,防止相关性错误出现问题。

应用场景:QQ换皮肤(一换一整套,不能有两个外衣)

 

单例模式(创建型模式)

应用条件:一个类只有一个实例。

原理:用一个静态变量保存自身实例,提供方法来访问。

经验:修改静态实例要加锁。

应用场景:一个国家一个主席。

 

 

 

 

观察者模式(行为模式,更关注对象之间的通信)

应用条件:对象之间的一对多的依赖关系。实现在特定条件下由“一”通知“多”。

实现原理:由观察者(observer)自己在实例化的时候组合进去一个保存观察者超类指针数组的通知类(subject),在观察者类中调用通知类的方法将自己(this指针)加入通知类中,利用多态原理,通知类在特定时刻调用观察者超类数组指针可以实现调用观察者的方法。

关键代码:Observer、Subject、ArrayList。

经验:避免互相观察

应用场景:领导一进门通知所有服务员拍手欢迎。

使用例子:跟不同设备厂商进行对接时,使用不同的通讯技术,比如:MQ、socket、opc、webservice等,而且需要同时触发跟不同设备厂商的通讯,此时将这些通讯技术对象放到subject类中observer指针数组中,可以让subject同时同时observer数组。

 

命令模式(行为模式,参数化请求)

应用条件:请求与实现的松耦合,比如万能遥控器的按键对应不同的家电的不同功能,也可以更改对应关系。消息响应。与观察者的区别是观察者是一对多,命令是一对一。执行者的接口不一致,所以执行者不能抽象,只能是具体类,所以需要Command来统一接口后,多态的给调用者调用,者是命令模式的精髓。

关键代码:真正命令的执行对象(Received执行请求的类)、Command(命令基类)、ececute(命令基类的执行方法)、Invoker(调用的类)。执行者(Receiver)和命令基类是继承关系,命令基类指针和调用者(Invoker)是组合关系。

原理:用对象去表示一个行为,会更加灵活。

经验:请求的撤销(Undo)也可以使用命令模式。比如消息队列的部分内容撤销。使用泛型编程的函数对象,使用编译时多态来代替函数对象可以让代码性能更好。

 

迭代器模式(行为模式,不需知道集合对象底层表示前提下顺序访问集合对象元素)

实现原理:分离了集合对象的遍历行为,抽象出一个迭代器来负责。

应用条件:为了遍历不同的聚合类提供一个统一的接口。

关键代码:Iterator类、hasNext()、Next()

经验:由于新增聚合对象就要新增迭代器类,这样导致类的个数成对增加,增加了系统的复杂性。

 

 

 

装饰者模式(结构模式,作为一个现有类的包装)

应用条件:相对于使用继承来说有更松依赖关系的类的实现。

实现原理:装饰者(Decorator)在实例化的时候可以通过传入一个具体类(具有抽象父类),来扩展具体类的功能。这种实现方法不是is-a关系。适合依赖更松的条件。

经验:更松依赖、可撤销、功能上类似继承,实质上不是同一类型。

应用场景:木头被装饰之后变为沙发,被另一种装饰之后变为项链。

 

适配器模式(结构模式,将一个类的接口转为另一种)

实现原理:继承或依赖后实现。

应用场景:更改接口,dequeue与queue。

经验:适配器不是在项目设计时的方案,而是为了解决正在服役的项目问题。所以尽可能少用适配器,如果过多使用,不如重构。

 

外观模式(结构模式,隐藏系统复杂性,提供一个简单的统一的接口给客户)

实现原理:提供一个接口,代替客户实现了复杂的调用过程。

应用场景:MFC对WINAPI的封装。

 

桥接模式(结构模式,把抽象化与实现化解耦)

实现原理:抽象类依赖实现类。

应用场景:将功能分离,实现独立变化,减少他们之间的耦合。

 

posted on 2018-03-29 21:40  Grant-Zhang  阅读(132)  评论(0)    收藏  举报