外观模式
为子系统提供一个更高层次的,更简单的接口。降低客户与子系统的耦合度。现在多是分布式服务。外观模式就发挥了很大的作用。对于客户的一个对子系统的需求不需要直接与子系统交互。而是通过门面角色(接口)来进行操作。看一下类图:
仍然以我们买衣服为例。我们买衣服需要买外套,和裤子。卖外套和卖裤子则相当于俩个子系统。不使用外观模式。我们需要new一个卖外套实例一个卖裤子实例,然后分别调用它们的方法。这样客户和子系统的耦合度就较高(假如有10000个子系统),而使用外观模式,我们可以创建一个门面类。里面包含了卖衣服和卖裤子的方法,在实现时,我们只需和门面类就可以,不用和每个子系统进行交互。
具体代码实现呢我们给出门面的Java实现(以上面例子为例):
public class Facade {
private 外套 外套;
private 裤子 裤子
public Facade(外套 外套,裤子 裤子){
this.裤子 = 裤子;
this.外套 = 外套;
}
public void 买衣服(){
外套.买外套();
裤子.买裤子();
}
}
享元模式
用一个共享来避免大量拥有相同内容对象的开销。对象状态分为内蕴状态和外蕴状态。内蕴状态不会随环境而改变也就是共享的部分。外蕴状态是随环境改变而改变的,并且状态由客户端保存。不可共享。同样看一下类图:
有类图可以看出,在享元模式中我们有用到单例模式(工厂),对于享元的理解。我们可以以String类型为例。由于享元主要用于解决系统性能问题。而在项目中并不常用(使系统复杂化)。这里不多讲了,理解就好》
代理模式
说到代理模式,我想大家都不陌生,应该都有接触,比如著名的Spring中的面向切面编程的AOP。先看一下类图:
有类图可以看出,代理类,真实类必须实现统一接口。
来个例子
生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费。但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的。这点很重要!
上面这个例子,你就是“客户”,票务中心就是“代理角色”,火车站是“真实角色”,卖票称为“抽象角色”!
代理模式JAVA代码示例:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

代理模式允许使用抽象类或接口作为“抽象角色”,每个“代理角色”代理了一个“真实角色”,如果要代理的“真实角色”比较多,这势必造成大量的“代理角色”造成代码的急剧膨胀,其实其内部结构都是类似的,要是在运行时能动态生成“代理角色”就好了。