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

外观模式

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

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

使用场景

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

优点

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

缺点

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

相关设计模式

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

例子

现在很多应用都有积分换取礼品的模块。
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

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

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

发布了258 篇原创文章 · 获赞 161 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/104086223