当前位置: 代码迷 >> 综合 >> 设计模式-外观模式(Facade Pattern)
  详细解决方案

设计模式-外观模式(Facade Pattern)

热度:61   发布时间:2023-12-01 20:32:09.0

推荐:Java设计模式汇总

外观模式

定义
又叫门面模式,提供一个统一的接口,用来访问子系统中的一群接口。
外观模式定义了一个高层接口,让子系统更容易使用,隐藏了子系统的复杂性。

类型
这种类型的设计模式属于结构型模式。

例子

现在很多应用都有积分换取礼品的模块。
PointsGift类,积分礼品类,为了简单,就不做积分、库存是否满足要求的校验了。

package com.kaven.design.pattern.structural.facade;public class PointsGift {
    private String name;public PointsGift(String name) {
    this.name = name;}public String getName() {
    return name;}
}

QualifyService类,校验服务类,就是一个虚设,直接输出满足资格。

package com.kaven.design.pattern.structural.facade;public class QualifyService {
    public boolean isAvailable(PointsGift pointsGift){
    System.out.println("校验"+pointsGift.getName()+" 积分资格通过,库存通过。");return true;}
}

PointsPaymentService类,积分支付服务类,也是一个虚设,直接输出支付积分成功。

package com.kaven.design.pattern.structural.facade;public class PointsPaymentService {
    public boolean pay(PointsGift pointsGift){
    // 扣减积分System.out.println("支付"+pointsGift.getName()+" 积分成功。");return true;}
}

ShippingService类,物流服务类。

package com.kaven.design.pattern.structural.facade;public class ShippingService {
    public String shipGift(PointsGift pointsGift){
    //物流系统的对接逻辑System.out.println(pointsGift.getName()+"进入物流系统。");String shippingOrderNo = "6666";return shippingOrderNo;}
}

GiftExchangeService类,礼品兑换服务类,是外观模式的门面对象或者说外观对象,把上面的这些服务进行组合使用完成复杂的操作,给外部应用提供完成这一功能的接口,隐藏了子系统的复杂性。

package com.kaven.design.pattern.structural.facade;public class GiftExchangeService {
    private QualifyService qualifyService = new QualifyService();private  PointsPaymentService pointsPaymentService = new PointsPaymentService();private ShippingService shippingService = new ShippingService();public void giftExchange(PointsGift pointsGift){
    if(qualifyService.isAvailable(pointsGift)){
    //资格校验通过if(pointsPaymentService.pay(pointsGift)){
    //如果支付积分成功String shippingOrderNo = shippingService.shipGift(pointsGift);System.out.println("物流系统下单成功,订单号是:"+shippingOrderNo);}}}
}

应用层代码:

package com.kaven.design.pattern.structural.facade;public class Test {
    public static void main(String[] args) {
    PointsGift pointsGift = new PointsGift("键盘");GiftExchangeService giftExchangeService = new GiftExchangeService();giftExchangeService.giftExchange(pointsGift);}
}

结果:

校验键盘 积分资格通过,库存通过。
支付键盘 积分成功。
键盘进入物流系统。
物流系统下单成功,订单号是:6666

此时,我们便完成了一个简单的外观模式例子。

使用场景

  • 子系统越来越复杂,增加外观模式可以提供简单调用接口。
  • 为一个复杂的模块或子系统提供一个外界访问的接口。
  • 子系统相对独立,外界对子系统的访问只要黑箱操作即可。

优点

  • 简化了调用过程,无须了解、深入子系统,防止带来风险。
  • 减少系统依赖、松散耦合。 更好的划分访问层次。
  • 符合迪米特法则,即最少知道原则。
  • 减少了系统的相互依赖。
  • 提高了灵活性。不管系统内部如何变化,只要不影响到外观对象即可。

缺点

  • 增加子系统、扩展子系统行为容易引入风险。
  • 不符合开闭原则,修改会很麻烦。

相关设计模式

  • 外观模式和中介者模式:外观模式关注的是外界与子系统间的交互,而中介者关注的是子系统内部间的交互。
  • 外观模式和单例模式:通常可以把外观对象设计成单例模式。
  • 外观模式和抽象工厂模式:外观类可以通过抽象工厂获取子系统的实例,子系统可以从内部对外观类进行屏蔽。

如果有说错的地方,请大家不吝赐教(记得留言哦~~~~)。

  相关解决方案