设计模式之外观模式

定义

1
2
3
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
场景:在对接复杂的旧的系统时,新功能可以作为一个子系统 开发一个外观 Facade 类,来提供设计粗糙或高复杂的遗留代码的比较清晰的简单接口,
让新系统与 Facade对象交付, Facade与遗留代码交互所有复杂工作。

代码解释

1
2
3
TradingFacade类作为一个高层接口,简化了客户端的操作。客户端不需要直接与Stock和Fund类交互,而是通过TradingFacade进行所有操作。
这种设计降低了系统的耦合度。如果将来需要修改Stock或Fund类的实现,只需要相应地调整TradingFacade类,而不会影响到使用这个外观的客户端代码。
外观类还可以轻松地添加新的功能。例如,如果我们想要添加一个同时买入多只股票的功能,我们只需要在TradingFacade类中添加一个新方法,而不需要修改客户端代码。

代码

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
// 个股类
class Stock {
private String name;
private double price;

public Stock(String name, double price) {
this.name = name;
this.price = price;
}

public void buy() {
System.out.println("买入股票: " + name + ", 价格: " + price);
}

public void sell() {
System.out.println("卖出股票: " + name + ", 价格: " + price);
}
}

// 基金类
class Fund {
private String name;

public Fund(String name) {
this.name = name;
}

public void buy() {
System.out.println("买入基金: " + name);
}

public void sell() {
System.out.println("卖出基金: " + name);
}
}

// 外观类
class TradingFacade {
private Stock stock1, stock2;
private Fund fund;

public TradingFacade() {
stock1 = new Stock("腾讯", 500.0);
stock2 = new Stock("阿里巴巴", 200.0);
fund = new Fund("创新科技基金");
}

public void buyStocks() {
stock1.buy();
stock2.buy();
}

public void sellStocks() {
stock1.sell();
stock2.sell();
}

public void buyFund() {
fund.buy();
}

public void sellFund() {
fund.sell();
}
}

// 主类
public class StockMarketExample {
public static void main(String[] args) {
TradingFacade facade = new TradingFacade();

System.out.println("执行一系列交易操作:");
facade.buyStocks();
facade.buyFund();
facade.sellStocks();
facade.sellFund();
}
}