外观模式定义:为子系统中的一组接口提供一个一致的界面
此模式定义了一个高层接口,该接口使得这一子系统更加容易使用
public class Stock {
public void buy(){
System.out.println("购买股票");
}
public void sell(){
System.out.println("抛售股票");
}
}
public class Currency {
public void buy(){
System.out.println("购买货币");
}
public void sell(){
System.out.println("抛售货币");
}
}
public class Person {
public void invest(){
Stock apple = new Stock();
Stock google = new Stock();
Stock facebook = new Stock();
Currency rmb = new Currency();
Currency dollar = new Currency();
apple.buy();
google.buy();
facebook.buy();
rmb.buy();
dollar.buy();
}
public void disinvest(){
Stock apple = new Stock();
Stock google = new Stock();
Stock facebook = new Stock();
Currency rmb = new Currency();
Currency dollar = new Currency();
apple.sell();
google.sell();
facebook.sell();
rmb.sell();
dollar.sell();
}
}
站在Person的角度思考其实不关心投资的具体细节,关注的是投资这个动作,如此一来,我们应该考虑封装具体实现细节,对外提供统一的方法进行调用,这样将使接口调用方和复杂的实现解耦
public class Invest {
private Stock apple;
private Stock google;
private Stock facebook;
private Currency rmb;
private Currency dollar;
public Invest(){
apple = new Stock();
google = new Stock();
facebook = new Stock();
rmb = new Currency();
dollar = new Currency();
}
public void buy(){
apple.buy();
google.buy();
facebook.buy();
rmb.buy();
dollar.buy();
System.out.println("购买股票");
}
public void sell(){
apple.sell();
google.sell();
facebook.sell();
rmb.sell();
dollar.sell();
System.out.println("抛售股票");
}
}
public class Person {
public void invest(){
Invest invest = new Invest();
invest.buy();
}
public void disinvest(){
Invest invest = new Invest();
invest.sell();
}
}
特别要注意的是,外观模式并没有封装子系统(封装的是业务业务流程,对外提供统一接口),如果需要,依然可以直接调用子系统中的类,但是既然已经进行了封装,最好不要直接调用
对于简单的流程,使用外观模式会提高带码的复杂度,得不偿失