“炒股票是一件很常见的事,但是没有足够了解证券知识的情况下去做股票,很容易亏钱。毕竟要学的东西太多了,不具备这些知识就很难做好,再者就是心态很重要,刚开始接触股票的人一般都盼着涨,于是心态很不稳定,这反而做不好股票。但是,我们可以交给基金来管理啊。。。”这其实就是一个设计模式,外观模式。
模式定义
所谓外观模式就是提供一个统一的接口,用来访问系统中的一群接口。这个接口使得这一群接口易于管理。
外观模式定义了一个高层的接口,让子系统更容易的使用。
模式结构
模式实现
外观类
package com.bjsxt.facade;
public class Fund {
private Stock1 stock1 = null;
private Stock2 stock2 = null;
private NationalDet nationalDet = null;
private Realty realty = null;
public Fund() {
stock1 = new Stock1();
stock2 = new Stock2();
nationalDet = new NationalDet();
realty = new Realty();
}
public void buyFund(){
stock1.buy();
stock2.buy();
nationalDet.buy();
realty.buy();
}
public void sellFund(){
stock1.sell();
stock2.sell();
nationalDet.sell();
realty.sell();
}
}
子系统
package com.bjsxt.facade;
public class Stock1 {
public void sell(){
System.out.println("股票一抛出!");
}
public void buy(){
System.out.println("股票一买入!");
}
}
package com.bjsxt.facade;
public class Stock2 {
public void sell(){
System.out.println("股票二抛出!");
}
public void buy(){
System.out.println("股票二买入!");
}
}
package com.bjsxt.facade;
public class NationalDet {
public void sell(){
System.out.println("国债抛出!");
}
public void buy(){
System.out.println("国债买入!");
}
}
package com.bjsxt.facade;
public class Realty {
public void sell(){
System.out.println("卖出房地厂!");
}
public void buy(){
System.out.println("买入房地产!");
}
}
客户端
package com.bjsxt.facade;
public class Client {
public static void main(String[] args) {
Fund fund = new Fund();
fund.buyFund();
}
}
模式优缺点
优点
1、引入外观模式,是客户对子系统的使用变得简单了,减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系。
2、只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
3、降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
缺点
1、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
2、在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
使用场景
客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性
模式总结
实现了客户于子系统的松耦合,但是同时也违背了“开放封闭原则”。