学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通过不断的练习和实践,掌握其中的奥妙,选择合适的设计模式,能为我们的项目增加一丝神奇的魔力。
文章目录
- 概念:
- 实例:
- 目的:
- 适用场景:
- 优点:
- 弊端:
- 类图:
- 框架用到的地方:
- Coding:
- 测试
- 测试结果
概念:
定义一个高层接口,这个接口使得子系统更加容易使用。外部与子系统通过一个统一的外观对象进行通信,来隐藏系统的复杂性。
实例:
AliPay按客户设置的消费顺序,找到余额足够的支付方式进行消费
目的:
通过暴露AliPay,帮助客户更简单的支付
适用场景:
系统有多个模块但你只希望提供给用户一个外观类时使用
优点:
1、对外提供一个接口,避免客户端直接与复杂系统交互
2、客户端与外观对象之间的依赖关系,减少了客户端与子系统之间的耦合度
3、外观模式可以在不影响客户端的情况下修改系统的实现
弊端:
违反开闭原则(如果子系统修改,我们不得不修改外观模式类的代码)
类图:
框架用到的地方:
在 MVC 架构中,Controller层是外观类。
Coding:
YuEbao
public class YuEbao {
public static Integer balance = 10;
public void useYuEbao(){
System.out.println("通过余额宝消费");
}
public static Integer getBalance() {
return balance;
}
}
DepositCard
public class DepositCard {
public static Integer balance = 1;
public void useDepositCard(){
System.out.println("通过借记卡消费");
}
public static Integer getBalance() {
return balance;
}
}
CreditCard
public class CreditCard {
public static Integer balance = 3000;
public void useCreditCard(){
System.out.println("通过信用卡消费");
}
public static Integer getBalance() {
return balance;
}
}
AliPay
public class AliPay {
CreditCard creditCard;
DepositCard depositCard;
YuEbao yuEbao;
public void toPay(Integer price) {
// 按客户设置的消费顺序,找到余额足够的支付方式进行消费
if (yuEbao.getBalance() > price) {
yuEbao.useYuEbao();
} else if (creditCard.getBalance() > price) {
creditCard.useCreditCard();
} else if (depositCard.getBalance() > price) {
depositCard.useDepositCard();
} else {
System.out.println("你买不起!");
}
}
public AliPay() {
}
}
测试
public static void main(String[] args) {
AliPay aliPay = new AliPay();
aliPay.toPay(10499);
}
测试结果
你买不起!
我们将“AliPay”看作是外观类,通过它我们就无需关心那张卡的余额足够消费的,通过“AliPay”传入消费金额,就可以自动选择支付方式了