facade 设计模式:
facade 设计模式,有人称之为门面设计模式,也有人称之为外观设计模式。不管他叫什么,本人对它的理解为,它是对多个方法功能的封装。使其暴露一个入口。
demo:
现有类:股票A 股票B,有一需求是买股票,和卖出股票。
StockA:
package com.juvenxu.helloworld;
public class StockA {
private int number = 0;
public void sell(int number){
this.number -= number;
}
public void pay(int number){
this.number += number;
}
public int getNumber() {
return number;
}
}
StockB:
package com.juvenxu.helloworld;
public class StockB {
private int number = 0;
public void sell(int number){
this.number -= number;
}
public void pay(int number){
this.number += number;
}
public int getNumber() {
return number;
}
}
不使用facade 设计模式前同时买入股票a,b各10张的做法
@Test
public void test2(){
StockA stockA = new StockA();
StockB stockB = new StockB();
stockA.pay(10);
stockB.pay(10);
System.out.println(stockA.getNumber());
System.out.println(stockB.getNumber());
}
使用facade 创建一个代理类StockProxy:
StockProxy:
package com.juvenxu.helloworld;
public class StockProxy {
StockA stockA;
StockB stockB;
public static StockProxy Initialize(){
synchronized (StockProxy.class){
return new StockProxy();
}
}
public StockProxy(){
this.stockA = new StockA();
this.stockB = new StockB();
}
public int getStockANumber(){
return stockA.getNumber();
}
public int getStockBNumber(){
return stockB.getNumber();
}
public void sellAll(int number){
stockB.sell(number);
stockA.sell(number);
}
public void payAll(int number){
stockA.pay(number);
stockB.pay(number);
}
}
此时的测试方法:
@Test
public void test3() {
StockProxy stockProxy = StockProxy.Initialize();
stockProxy.payAll(10);
System.out.println(stockProxy.getStockANumber());
System.out.println(stockProxy.getStockBNumber());
}
使用此设计模式的好处就是将业务逻辑封装到了代理类中,这样做降解了StockA、B和业务逻辑间的耦合,并且还不影响StockA、B的代码。又符合设计原则中的开闭原则,方便以后的升级和维护