门面模式
目的:定义一组高层接口让子系统更易用。
举例: A,提供了 a、b、c、d 四个接口。系统 B 完成某个业务功能,需要调用 A 系统的 a、b、d 接口。利用门面模式,我们提供一个包裹 a、b、d 接口调用的门面接口 x,给系统 B 直接使用。
应用:
易用,符合接口隔离和迪米特法则。
性能好,如果调用者要走网络,把三个接口一次性调用完,显然性能更高
解决事务问题,要么都成功,要么都失败。
ps:
接口:太大会导致接口不可复用,太小会导致接口不易用。
可以把门面接口和底层接口放在一起,最好是重新开一层。
组合模式
目的:把对象组织成树形,可以对集合和元素做统一处理,非常方便。
关键字:树形。
举例: 目录和文件;部门和员工。
基类 class a
元素类 class ele:a
集合类 class set:a
{
list<a> m_set;
void add(a );
void do();
}
client 主要对set操作
{
set x
x.do()
}
享元模式
共享的单元的简称
目的,节省内存
前提,享元对象是不可改变对象。
原理,如果这些重复的对象是不可变对象,在内存中只保留一份实例,供多处代码引用(缓存进工厂)
举例
1.下棋的游戏房间;每个棋盘的中的棋子的 id 颜色 名称 可以做为 享元类;只需要改坐标,所以享元类+坐标 = 棋子类
所以,10000个棋盘,可以共享这些棋子,节省不少内存。
2.文本编辑器,享元类(字体,颜色,格式)+ 字类型 = 字类
ps:
有点类似 单例的变体 : 多例;但是享元模式是为了对象复用,节省内存,而多例模式是为了限制对象的个数。
享元的缓存,是为了复用;其他缓存,为了复用。
享元的复用,是共享;对象池的复用,是需要先释放,在使用
比如字符串常量,就是共享单元。
写时拷贝,类似共享单元。
缺点:
如果,共享单元被用到频率很低,或者用了马上就释放,那么反而会浪费内存。