设计模式-7种结构型模式

适配器模式:

将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同调用。

桥接模式:

将类的抽象部分和他的实现部分分离开来。是他们可以独立的变化。

它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

例如画笔接口下具体的画笔实现,有粗画笔、细画笔,也有红色、蓝色,如果要是为每一种类都定义一个实现类,则会出现类爆发。所以只有将颜色也定义一个接口,粗细定义一个接口。然后画笔的抽象类将这两个接口组合起来。

Pen{

Color color;

Width width;

}

这个示例很多人都这么说,都在这么用,但是其实不合适。用画笔举例绝对所有人第一时间都会想到就应该这样的组合起来设计,怎么可能会去不同颜色不同粗细分别定义实现类。所以学习这个例子只会让人更懵。(把一个本来简单的问题复杂化,然后告诉你有一个模式可以把这个复杂问题变简单,有意思么?)

其实桥接模式的核心在于抽象部分和他的实现部分分离开来。

抽象部分就是有个工具箱接口utilinterface,定义了画画draw这个方法。

utilinterface{

viod draw();

}

实现部分就不是普通的去定义一个工具实现类来实现这个抽象类(utilClass implement utilinterface)并且实现画画方法来。而是另外一个不相干的实现类,例如不相干的画笔类PenClass实现具体的画画方法。同时将这个画笔工具类,作为utilinterface的实现类utilCalss类中的属性组合起来。就变成了如下:

utilCalss implement utilinterface {

PenClass  penClass=getXXPenClass();//先在构造方法或者某个地方配置某个具体的画笔类;

// utilCalss的画画功能其实是其中组合的penclass来执行的具体画画内容

viod draw(){ penClass.draw()};

}

这才是抽象部分和实现部分分离开来。才是通过组合关系代替继承关系。这才是桥接模式!

例如:Jdbc的DriverManager的getConnetion获取数据库连接的方法其实就是用的里面注册的具体的某个数据库驱动的连接方法生成的连接返回的。

组合模式:

将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式的核心思想是将对象看作是一个树形结构,其中每个节点可以是一个单独的对象(叶子节点)或者一个包含其他节点的容器(组合节点)。例如在java中可以通过组合模式来模拟文件系统,有node接口定义了顶层的操作接口,获取节点基本信息,查询子节点,新增子节点等。

装饰模式:

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。增加一个装饰器类,持有被装饰的对象,并且和被装饰对象实现相同的接口方法。但是重写方法加上额外的装饰功能(打印日志等)。(装饰模式和桥接模式都有一个对象持有另一个对象的这种相同点,但是器目的不同,桥接的目的是为了将抽象部分和实现部分分离。装饰器的目的是为了添加额外的职责)

外观模式:

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。(例如ApplicationContext是Spring框架的核心容器,它隐藏了底层的复杂性,并提供了简单易用的接口供开发人员使用。通过ApplicationContext,开发人员可以轻松地获取和管理Spring管理的bean对象,而无需关注底层的实例化、依赖注入等细节)

享元模式:

运用共享技术有效地复用对象。减少系统中低等级的,详细的对象数目。减少了要处理的对象数目,减少了内存。(亨元对象能做到共享的关键是区分内部状态和外部状态。内部状态基本不改变,因此可以共享,基础的图元或者文字经常采用享元模式)Integer类有一些缓存机制,当int值在-128127之间时,会重用相同的Integer对象。这是因为JavaInteger类在这些值范围内实现了享元模式

代理模式:

将一个对象的行为代理给另一个对象。其实从结构上来说模式和装饰模式非常相似,都是一个代理类或者装饰类,持有被代理类或者被装饰类的引用。其区别在于:

1,目的不同:代理模式是为了控制对原对象的访问,隐藏真实对象。装饰模式是为了动态的增加原对象的功能。

2,实现方式:被代理对象通常不直接对外提供服务。被装饰类通常可以自行的对外体提供服务只是没有了被增强的功能而已。

3,代理模式中代理类与被代理类通常存在较强的耦合关系;而装饰模式中装饰类与被装饰类通常没有耦合关系,可以被随意替换。

你可能感兴趣的:(设计模式)