Java设计模式-门面模式

背景

最近古铁工厂和白骑士工厂达成了一个战略合作,双方的研发人员耗时一个月共同完成了古铁和白骑士合体技的装配。合体技亡灵狂舞伤害不菲,实为杀敌利器。古铁的驾驶员响介和白骑士的驾驶员艾克塞林最近正在试练亡灵狂舞。
响介:搞不明白这个破玩意要耗时一个月,所谓的合体技就是把所有的武器都使用一遍,有什么意思~~
艾克塞林:我觉得还是挺好用的,以前需要按好几个按钮,现在一个大招只需要一键启动,挺方便的
响介:但是这样就不能凸显我的技术了…我响介就算跳下去,不吃饭饿死,也不会用一键模式…
艾克塞林:你用不用一键模式管我什么事,从今就撩开手…

实现

古铁

/**
 * 古铁
 */
public class AncientIron {
    
    public void tripleGun() {
        System.out.println("三联机关枪!");
    }
    
    public void heatGasHorn() {
        System.out.println("热气角!");
    }

    public void revolverPileDriver() {
        System.out.println("左轮打桩机!");
    }
    
    public void pointerMine() {
        System.out.println("指向性地雷!");
    }
    
    /**
     * 底牌:组合招,将上面四种攻击组合在一起
     */
    public void bottomCard() {
        tripleGun();
        heatGasHorn();
        revolverPileDriver();
        pointerMine();
    }
    
}

白骑士

/**
 * 白骑士
 */
public class WhiteKnight {
    
    public void tripleGun() {
        System.out.println("三联机关炮!");
    }
    
    public void augustineGunB() {
        System.out.println("奥古斯丁长枪炮B!");
    }
    
    public void augustineGunE() {
        System.out.println("奥古斯丁长枪炮E!");
    }
    
    /**
     * 奥古斯丁长枪炮W:组合技,将上面三种攻击组合
     */
    public void augustineGunW() {
        tripleGun();
        augustineGunB();
        augustineGunE();
    }
    
    
}

合体攻击门面

/**
 * 合体攻击门面
 */
public class CooperateAttackFacade {

    private AncientIron ancientIron;
    
    private WhiteKnight whiteKnight;

    public CooperateAttackFacade(AncientIron ancientIron, WhiteKnight whiteKnight) {
        super();
        this.ancientIron = ancientIron;
        this.whiteKnight = whiteKnight;
    }
    
    /**
     * 麻烦的亡灵狂舞:不符合最少依赖原则。
     */
    public void troubleGhostDance() {
        ancientIron.tripleGun();
        ancientIron.heatGasHorn();
        ancientIron.revolverPileDriver();
        ancientIron.pointerMine();
        whiteKnight.tripleGun();
        whiteKnight.augustineGunB();
        whiteKnight.augustineGunE();
    }
    
    /**
     * 亡灵狂舞:古铁和白骑士的合体技,由各自的组合技合成
     */
    public void ghostDance() {
        ancientIron.bottomCard();
        whiteKnight.augustineGunW();
    }
    
}

测试

public class Test {
    
    public static void main(String[] args) {
        System.out.println("--------------");
        AttackFacade facade = new AttackFacade(new AncientIron(), new WhiteKnight());
        facade.troubleGhostDance();  // 繁琐的暴走幽灵:按多个按钮,不过响介队长很喜欢~~
        System.out.println("--------------");
        facade.ghostDance(); // 最棒的暴走幽灵,一键启动
        System.out.println("--------------");
    }
    
}

测试结果

--------------
三联机关枪!
热气角!
左轮打桩机!
指向性地雷!
三联机关炮!
奥古斯丁长枪炮B!
奥古斯丁长枪炮E!
--------------
三联机关枪!
热气角!
左轮打桩机!
指向性地雷!
三联机关炮!
奥古斯丁长枪炮B!
奥古斯丁长枪炮E!
--------------
小结

响介:一键模式挺方便的,真香~

总结

门面模式相信各位在平时开发中经常见到吧,通过controller层去调用service层,通过service层去调用dao层,就是采用了门面模式。本章还涉及到一种设计原则–最少依赖原则,大概就是对自己依赖的类了解足够少。上面的troubleGhostDance就违犯了这一原则,依赖了很多方法,而ghostDance方法只需要依赖两个方法,并且能够达到相同的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值