门面模式-Facade Pattern(Java实现)

门面模式-Facade Pattern

为一个复杂的模块或子系统提供一个简单的供外界访问的接口

本文中代码的例子如下: 一个矿场有很多矿工, 矿工的职责也都不一样. 但一样的是什么呢? 一样的就是每个矿工每天都在重复一样的事情....起床, 上班, 工作, 下班, 睡觉......

要想管理这么多矿工的这么多事情可不简单(好麻烦啊...挨个调用的时候开发者也有可能会忘掉某个人, 或者忘掉某一个方法).,

再举个栗子, 比如操作数据库也一样, 要加载驱动, 建立连接, 操作数据库, 关闭连接. 这么多步骤忘掉一个都会是个问题.

MineWorker抽象类

这里是矿场中工人的统一抽象定义.

public abstract class MineWorker {
    protected void goToSleep() {
        System.out.printf("%s 睡觉.\n", name());
    }

    protected void wakeUp() {
        System.out.printf("%s 早上醒过来.\n", name());
    }

    protected void goHome() {
        System.out.printf("%s 回家.\n", name());
    }

    protected void goToMine() {
        System.out.printf("%s 去矿场.\n", name());
    }

    protected abstract void work();

    protected abstract String name();

    public static enum Action {
        GO_TO_SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK
    }

    public void action(Action... actions) {
        for (Action action : actions) {
            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:
                    System.out.println("Undefined action");
                    break;
            }
        }
    }
}

CartOperator类

推车工人.

public class CartOperator extends MineWorker {
    @Override
    public void work() {
        System.out.printf("%s 运输矿石 \n", name());
    }

    @Override
    public String name() {
        return "推车工人";
    }
}  

GoldDigger类

挖金矿工人

public class GoldDigger extends MineWorker {

    @Override
    public void work() {
        System.out.printf("%s 挖金矿 .\n", name());
    }

    @Override
    public String name() {
        return "挖矿金工人";
    }
}

TunnelDigger类

挖隧道工人.

public class TunnelDigger extends MineWorker {

    @Override
    public void work() {
        System.out.printf("%s 挖隧道.\n", name());
    }

    @Override
    public String name() {
        return "挖隧道工人";
    }
}

MineFacade类

本系统的门面, 用于对外提供一个简单的接口.

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class MineFacade {

    private final List<MineWorker> mineWorkers;

    public MineFacade() {
        mineWorkers = new ArrayList<>();
        mineWorkers.add(new GoldDigger());
        mineWorkers.add(new CartOperator());
        mineWorkers.add(new TunnelDigger());
    }

    public void startNewDay() {
        makeActions(mineWorkers, MineWorker.Action.WAKE_UP, MineWorker.Action.GO_TO_MINE);
    }

    public void digOutGold() {
        makeActions(mineWorkers, MineWorker.Action.WORK);
    }

    public void endDay() {
        makeActions(mineWorkers, MineWorker.Action.GO_HOME, MineWorker.Action.GO_TO_SLEEP);
    }

    private static void makeActions(Collection<MineWorker> mineWorkers,
                                    MineWorker.Action... actions) {
        for (MineWorker mineWorker : mineWorkers) {
            mineWorker.action(actions);
        }
    }
}

Main

在这运行

public class Main {
    public static void main(String[] args) {
        // 实例化一个门面, 这是矿场对外提供的一个简单的接口
        MineFacade mineFacade = new MineFacade();

        // 开始新的一天
        mineFacade.startNewDay();

        // 大家起来干活
        mineFacade.digOutGold();

        // 一天结束啦
        mineFacade.endDay();
    }
}

运行结果如下:

原文地址:https://www.cnblogs.com/noKing/p/9065175.html

时间: 2024-08-05 21:34:24

门面模式-Facade Pattern(Java实现)的相关文章

设计模式之门面模式---Facade Pattern

模式的定义 门面模式(Facade Pattern)也叫做外观模式,定义如下: Provide a unified interface to a set of interfaces in a subsystem. Facade defines a highet-level interface that makes the subsystem easier to use. 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用. 类型 结构

php门面模式(facade pattern)

书上不全的代码,我自己补全的. <?php /* The facade pattern is used when we want to simplify the complexities of large systems through a simpler interface. It does so by providing convenient methods for most common tasks, through a single wrapper class used by a cli

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

1.模式动机 在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了. 软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂.这时如果系统内部发生改变,客户端也要跟着改变,这违背了"开闭原则",也违背了"迪米特法则(最少知道原则)",所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标. 2.模式定义 外观模式(F

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

设计模式 - 外观模式(facade pattern) 详解

外观模式(facade pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用. 外观模式包含三个部分: 1. 子系统: 子类, 单个复杂子类 或 多个子类; 2. 外观(facade)类: 把子系统设计的更加容易使用; 3. 客户: 只需要调用外观类. 与适配器模式(adapter pattern)的

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包括迭代器接口(iterator interface), import java.util.Iterator; 继承

二十四种设计模式:外观模式(Facade Pattern)

外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 示例有一个Message实体类,某对象对它的操作有Get()方法,另外还有一个对象有一个Validate()方法来判断用户是否有权限.现在提供一个高层接口来封装这两个方法. MessageModel using System; using System.Collections.Generic; using System.Text; nam

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)參见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 当中FilterInputStream类, 就是装饰者(decorato