facade(门面模式或外观模式)

门面模式是一种设计模式,它提供了一个统一的接口来简化子系统的交互。本文通过一个挖矿系统的例子展示了如何运用门面模式,将原本需要与多个矿工直接交互的过程简化为只与基金经理(门面)交互,从而降低了使用的复杂性。在实践中,创建了金矿工人抽象类和三个具体矿工类,并实现了一个挖矿门面,通过门面进行开始新的一天、挖掘黄金和结束一天的操作,使得整个流程变得更加清晰和易于理解。
摘要由CSDN通过智能技术生成

一、介绍

外观模式:为子系统的一组接口提供一个一致的界面,此模式提供了一个高层级的接口,这个接口是的这个子系统更加易用。

Facade pattern provides a simplified interface to a complex subsystem.

《大话设计模式》中的例子之韭菜的故事

应用门面模式之前,客户需要自己去买股票、债券等各种理财产品,相对来说比比较复杂,需要了解的知识较多。

在用于门面模式后,客户只需要跟基金经理打交道,不需要去关注股票等产品。此时基金经理就相当于定义中一个更高层级的接口,通过基金经理使得复杂的理财操作变得简单。

二、门面模式实践

例子来自java-design-patterns.com

通过门面操作金矿工人,门面定义了startNewDay、digOutGold和endDay,通过门面DwarvenGoldmineFacade操作3个金矿工人挖矿。

  • 矿工的基类
package com.keller.design.facade;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;

@Slf4j
public abstract class DwarvenMineWorker {
	public void goToSleep() {
		log.info("{} goes to sleep.", name());
	}
	
	public void wakeUp() {
		log.info("{} wakes up.", name());
	}
	
	public void goHome() {
		log.info("{} goes home.", name());
	}
	
	public void goToMine() {
		log.info("{} goes to the mine.", name());
	}
	
	private void action(Action action) {
		switch (action) {
			case GO_TO_SLEEP:
				goToSleep();
				break;
			case WAKE_UP:
				wakeUp();
				break;
			case GO_HOME:
				goHome();
				break;
			case GO_TO_MINE:
				goToMine();
				break;
			case WORK:
				work();
				break;
			default:
				log.info("Undefined action");
				break;
		}
	}
	
	public void action(Action... actions) {
		Arrays.stream(actions).forEach(this::action);
	}
	
	public abstract void work();
	
	public abstract String name();
	
	enum Action {
		GO_TO_SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK
	}
}
  • 3名矿工
package com.keller.design.facade;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class DwarvenCartOperator extends DwarvenMineWorker {
    @Override
    public void work() {
        log.info("{} moves gold chunks out of the mine.", name());
    }

    @Override
    public String name() {
        return "Dwarf cart operator";
    }
}
package com.keller.design.facade;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class DwarvenGoldDigger extends DwarvenMineWorker {
    @Override
    public void work() {
        log.info("{} digs for gold.", name());
    }

    @Override
    public String name() {
        return "Dwarf gold digger";
    }
}
package com.keller.design.facade;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class DwarvenTunnelDigger extends DwarvenMineWorker {
    @Override
    public void work() {
        log.info("{} creates another promising tunnel.", name());
    }

    @Override
    public String name() {
        return "Dwarven tunnel digger";
    }
}
  • 挖矿门面
package com.keller.design.facade;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class DwarvenGoldmineFacade {
    private final List<DwarvenMineWorker> workers;

    public DwarvenGoldmineFacade() {
        workers = Arrays.asList(
                new DwarvenGoldDigger(),
                new DwarvenCartOperator(),
                new DwarvenTunnelDigger());
    }

    public void startNewDay() {
        makeActions(workers, DwarvenMineWorker.Action.WAKE_UP, DwarvenMineWorker.Action.GO_TO_MINE);
    }

    public void digOutGold() {
        makeActions(workers, DwarvenMineWorker.Action.WORK);
    }

    public void endDay() {
        makeActions(workers, DwarvenMineWorker.Action.GO_HOME, DwarvenMineWorker.Action.GO_TO_SLEEP);
    }

    public static void makeActions(Collection<DwarvenMineWorker> workers, DwarvenMineWorker.Action... actions) {
        workers.forEach(worker -> worker.action(actions));
    }
}
  • 通过操作门面去挖矿
package com.keller.design.facade;

public class Test {
    public static void main(String[] args) {
        DwarvenGoldmineFacade facade = new DwarvenGoldmineFacade();
        facade.startNewDay();
        facade.digOutGold();
        facade.endDay();
    }
}
  • 测试结果
23:29:47.291 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarf gold digger wakes up.
23:29:47.300 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarf gold digger goes to the mine.
23:29:47.301 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarf cart operator wakes up.
23:29:47.301 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarf cart operator goes to the mine.
23:29:47.302 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarven tunnel digger wakes up.
23:29:47.302 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarven tunnel digger goes to the mine.
23:29:47.302 [main] INFO  c.k.design.facade.DwarvenGoldDigger - Dwarf gold digger digs for gold.
23:29:47.303 [main] INFO  c.k.d.facade.DwarvenCartOperator - Dwarf cart operator moves gold chunks out of the mine.
23:29:47.303 [main] INFO  c.k.d.facade.DwarvenTunnelDigger - Dwarven tunnel digger creates another promising tunnel.
23:29:47.304 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarf gold digger goes home.
23:29:47.304 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarf gold digger goes to sleep.
23:29:47.304 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarf cart operator goes home.
23:29:47.305 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarf cart operator goes to sleep.
23:29:47.305 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarven tunnel digger goes home.
23:29:47.306 [main] INFO  c.k.design.facade.DwarvenMineWorker - Dwarven tunnel digger goes to sleep.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值