设计模式-观察者模式-java-中文版

码上见分晓!
中文版本的设计模式详解,案例中的代码尽量使用了中文.
以游戏和生活中较好理解的场景讲解设计模式的实际用法,便于理解吸收,让设计模式的学习不再困难!!!
更多设计模式欢迎来到我的开源项目设计模式中文版

https://gitee.com/nightrunner/chinese-version-of-design-patterns

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

/**
 * 进入夜晚,野怪们入睡啦!!!
 */
public class 观察者模式主程序 {
    public static void main(String[] args) {

        昼夜转换器 昼夜转换器 = new 昼夜转换器();

        昼夜转换器.增加观察者(new 月井());
        昼夜转换器.增加观察者(new 人马());
        昼夜转换器.增加观察者(new 石头人());
        昼夜转换器.增加观察者(new 巨魔());

        昼夜转换器.时间流逝(50);
    }
}

enum 昼夜 {
    白天,
    夜晚
}

interface 昼夜观察者 {
    void 昼夜变化(昼夜 变化后);
}

abstract class 野怪 implements 昼夜观察者 {
    @Override
    public void 昼夜变化(昼夜 变化后) {
        if (变化后 == 昼夜.夜晚) {
            System.out.printf("进入夜晚,%s慢慢进入沉睡%n", this);
        } else if (变化后 == 昼夜.白天) {
            System.out.printf("进入白天,%s慢慢开始苏醒%n", this);
        }
    }

    @Override
    public String toString() {
        return "野怪{" + this.getClass().getSimpleName() + "}";
    }
}

class 巨魔 extends 野怪 {
}

class 石头人 extends 野怪 {
}

class 人马 extends 野怪 {
}

class 月井 implements 昼夜观察者 {

    @Override
    public void 昼夜变化(昼夜 变化后) {
        if (变化后 == 昼夜.夜晚) {
            System.out.println("进入夜晚,月井开始缓慢恢复水量");
        } else if (变化后 == 昼夜.白天) {
            System.out.println("进入白天,月井无法恢复水量了");
        }
    }
}

class 昼夜转换器 {

    Integer 时钟 = 0;

    昼夜 当前昼夜 = 昼夜.夜晚;

    昼夜转换器() {
    }

    public void 时间流逝(Integer 小时数) {
        for (Integer i = 0; i < 小时数; i++) {
            时钟++;
            时钟 %= 25;

            boolean 昼夜交替时间 = 昼夜交替时间();

            if (昼夜交替时间) {
                System.out.printf("时间流逝了1个小时,现在是%s点,昼夜交替%n", 时钟 % 25, 当前昼夜);
                当前昼夜 = 当前昼夜 == 昼夜.夜晚 ? 昼夜.白天 : 昼夜.夜晚;
                通知观察者们(当前昼夜);
            } else {
                System.out.printf("时间流逝了1个小时,现在是%s点,%s%n", 时钟 % 25, 当前昼夜);
            }

        }
    }

    private boolean 昼夜交替时间() {
        return 时钟 == 7 || 时钟 == 17;
    }

    List<昼夜观察者> 昼夜观察者们 = new ArrayList<>();

    public void 增加观察者(昼夜观察者 昼夜观察者) {
        昼夜观察者们.add(昼夜观察者);
    }

    private void 通知观察者们(昼夜 变化后) {
        for (昼夜观察者 昼夜观察者 : 昼夜观察者们) {
            昼夜观察者.昼夜变化(变化后);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值