外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

类图示例

外观模式.png

举个例子

买卖基金

代码实现

1
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//股票一
class Stock1 {
public void Sell() {
System.out.println("Stock 1 sell");
}

public void Buy() {
System.out.println("Stock 1 buy");
}
}
//股票二
class Stock2 {
public void Sell() {
System.out.println("Stock 2 sell");
}

public void Buy() {
System.out.println("Stock 2 buy");
}
}
//股票三
class Stock3 {
public void Sell() {
System.out.println("Stock 3 sell");
}

public void Buy() {
System.out.println("Stock 3 buy");
}
}
//国债
class NationalDebt {
public void Sell() {
System.out.println("National Debt sell");
}

public void Buy() {
System.out.println("National Debt buy");
}
}
//房地产
class Realty {
public void Sell() {
System.out.println("Realty sell");
}

public void Buy() {
System.out.println("Realty buy");
}
}
//基金类
class Fund {
Stock1 stock1;
Stock2 stock2;
Stock3 stock3;
NationalDebt nationalDebt;
Realty realty;

public Fund() {
stock1 = new Stock1();
stock2 = new Stock2();
stock3 = new Stock3();
nationalDebt = new NationalDebt();
realty = new Realty();
}

public void BuyFund() {
stock1.Buy();
stock2.Buy();
stock3.Buy();
nationalDebt.Buy();
realty.Buy();
}

public void SellFund() {
stock1.Sell();
stock2.Sell();
stock3.Sell();
nationalDebt.Sell();
realty.Sell();
}
}

public class Facade {
public static void main(String[] args) {
Fund fund = new Fund();
fund.BuyFund();
fund.SellFund();
}
}

类图

基金外观模式.png

外观模式包含如下角色

  1. Facade类:提供高层接口,简化客户端与子系统的交互。
  2. 子系统类:实现具体的业务逻辑,被Facade类调用。

模式分析

  • 优点
    1. 减少依赖:客户端与子系统之间的依赖减少。
    2. 提高灵活性:子系统的内部变化不会影响客户端。
    3. 增强安全性:隐藏了子系统的内部实现,只暴露必要的操作。
  • 缺点
    1. 违反开闭原则:对子系统的修改可能需要对外观类进行相应的修改。