1.代理模式
1.1 静态代理
- 用户只关心接口功能,而不在乎谁提供了功能。上图中接口是 Subject
- 接口真正实现者是上图的 RealSubject,但是它不与用户直接接触,而是通过代理。
- 代理就是上图中的 Proxy,由于它实现了Subject接口,所以它能够直接与用户接触。
- 用户调用 Proxy 的时候,Proxy 内部调用了 RealSubject。所以,Proxy 是中介者,它可以增强 RealSubject 操作。
- 代码:
有的同学看了这个模式之后,就觉得非常的麻烦。有的同学可能会觉得播放正片之前的广告和之后的广告我们可以直接写到我们的ZhanlangMovie的play方法中。我们想一下,现在只有一个电影,就是战狼。如果我们有100个呢?是不是就是要复制100次。如果我们复制了过去的这些逻辑,需要变更的时候怎么办,是不是我们要改100次。并且加入说你这个ZhanlangMovie是第三方公司给你提供的包里面的类,这些包里面的类都是class文件,你手里面没有源代码,那怎么办。
比如我们上面的代码,我们可以看到用了代理模式之后,我们可以在不改动原有逻辑的条件下,扩展我们的逻辑。
1.2 动态代理
静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展。比如我们上节课的例子,你要实现不同的扩展方法就要编写不同的代理类,非常麻烦。
Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类。如果在程序中为一个或多个接口动态生成实现类,就可以使用 Proxy 来创建动态代理类。如果需要为一个或多个接口动态地创建实例,也可以使 Proxy 来创建动态代理实例。
2.装饰器模式
装饰器模式是在原有类的基础上动态添加新的功能,这种添加功能的方式不同于继承,它是在对象层面实现功能扩展(关联对象),而不是继承的类层面,因此说装饰器模式比继承更加灵活。另外,装饰器模式属于结构型设计模式。之前讲的都是创建型设计模式。创建型可以理解为生成新的对象,而结构型可以理解为构建更大的类或类对象。
实例:https://www.cnblogs.com/yssjun/p/11110013.html
简单来说,就是在之前对象的功能的基础上,不断添加新的功能,完成一种不断扩充功能的需求,不需要改变原有的类。
3.适配器模式
定义:
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法工作在一起的两个类能够在一起工作。不会改变原来的方法。
差别:差别在静态代理是代理和被代理类实现同一个接口,而适配器中的适配器实现一个接口、被适配的类是单独的一个类。
代码:
Public class AdapterPattern{ Public static void main(String[] args){ New Adapter(new Speaker()).translate(); } } Class Speaker{ public String speak(){ Return “China No.1”; } } Interface Translate{ Public String translate(); } Class Adapter implements translate{ private Speaker speaker; Public Adapter(Speaker speaker){ This.speaker = speaker; } Public translate(){ String result = speaker.speak(); ***** Return result; } }
4.外观模式
缺点:不符合开闭原则。
5. 享元模式
最典型的技术:池技术。
优缺点:
大大节约系统资源,外部状态相对独立,不会影响内部状态。而因为分离出内外状态,状态逻辑比较复杂
6. 组合模式
7. 桥接模式
将继承关系转换为关联关系,降低了耦合,将抽象和实现解耦,使得两者可以独立的变化。