美文网首页
设计模式 · 开关和灯泡的问题

设计模式 · 开关和灯泡的问题

作者: 单名一个冲 | 来源:发表于2019-07-29 17:55 被阅读0次

一、 假设我们现在有一个开关(打开和关闭)、还有一个灯泡(发光和不发光),开关控制灯泡,当开关打开后,灯泡亮。思考:你如何做设计?

  1. 无脑操作来一次(还好不是if-else):
public class SAPtest {
    public static void main(String[] args) {
        new Switch(new App()).togglc();
    }

    public static class Light {  //灯泡
        public void open(){
            System.out.println("我是灯泡,我发光了!");
        }

        public void off(){
            System.out.println("我是灯泡,我关灯了!");
        }
    }

    public static class Switch {  //开关
        private App app;

        public Switch(App app) {
            this.app = app;
        }

        public void togglc(){  //打开后再关闭
            app.open();
            app.off();
        }
    }
}

这可能就是最原始的面向对象,但是这样是否尽可能的满足扩展和复用性?可想而知,并不能!假设我们现在要加一个热水壶,我们怎么设计能够同时兼容这种开关?(从面向对象特性、抽象方式去思考)。

/**
 * 电器接口
 * 接口职责:电器工作、电器停止
 */
public interface ApplianceInterface {
    public void open();
    public void off();
}

public class SAPtest {
    public static void main(String[] args) {
        ApplianceInterface light = new Light();
        new Switch(light).togglc();
        ApplianceInterface kettle = new Kettle();
        new Switch(kettle).togglc();
    }

    public static class Light implements ApplianceInterface {  //灯泡
        @Override
        public void open() {
            System.out.println("我是灯泡,我发光了!");
        }

        @Override
        public void off() {
            System.out.println("我是灯泡,我关灯了!");
        }
    }

    public static class Kettle implements ApplianceInterface {  //热水壶
        @Override
        public void open() {
            System.out.println("我是热水壶,我开始热水了!");
        }

        @Override
        public void off() {
            System.out.println("我是热水壶,我停止热水了!");
        }
    }

    public static class Switch {  //开关
        private ApplianceInterface app;

        public Switch(ApplianceInterface app) {
            this.app = app;
        }

        public void togglc() {  //打开后再关闭
            app.open();
            // 。。。
            app.off();
        }
    }
}

这下比较好些了,我们提供了一个ApplianceInterface的接口,只要实现这个接口的,我的开关都兼容,这也是多态的一个简单示例;
再来点有难度的,我们来个100个假设:
1.假设我想让我的热水器在(现有的基础上,不改变原有类)加个闪光灯(是不是很潇洒);
2.假如我的开关也想让他也有多个按钮,加个开启闪光灯的按钮吧;
come on, zouni!

public class SAPtest {
    public static void main(String[] args) {
        ApplianceInterface2 kettle2 = new Kettle2();
        Switch aSwitch = new Switch(kettle2);
        aSwitch.togglc();
        aSwitch.colorStart();
    }

    public static class Kettle implements ApplianceInterface {  // 热水壶
        @Override
        public void open() {
            System.out.println("我是热水壶,我开始热水了!");
        }

        @Override
        public void off() {
            System.out.println("我是热水壶,我停止热水了!");
        }
    }

    public interface ApplianceInterface2 extends ApplianceInterface { // 新加的炫彩灯接口
        public void openColor();
    }

    public static class Kettle2 extends Kettle implements ApplianceInterface2 {  // 新的炫彩热水壶
        @Override
        public void open() {
            super.open();
        }

        @Override
        public void off() {
            super.off();
        }

        @Override
        public void openColor() {
            System.out.println("我是炫彩热水壶,我有彩灯!");
        }
    }

    public static class Switch implements SwitchInterface {  // 开关是新的
        private ApplianceInterface2 app;

        public Switch(ApplianceInterface2 app) {
            this.app = app;
        }

        public void togglc() {  //打开后再关闭
            start();
            // 。。。
            stop();
        }

        @Override
        public void start() {
            this.app.open();
        }

        @Override
        public void stop() {
            this.app.off();
        }

        @Override
        public void colorStart() {
            this.app.openColor();
        }
    }
}

实话说,用了什么设计模式,我也不知道,我也希望实战的人不要去关心叫什么,而是去运用面向对象的思维方式。具体应用了哪种模式我后续做个研究总结。

相关文章

  • 设计模式 · 开关和灯泡的问题

    一、 假设我们现在有一个开关(打开和关闭)、还有一个灯泡(发光和不发光),开关控制灯泡,当开关打开后,灯泡亮。思考...

  • Leetcode【319、672】

    问题描述:【Math】319. Bulb Switcher 解题思路: 灯泡开关。初始时有 n 个灯泡关闭,第 i...

  • 被爱上的灯泡|140字微小说

    灯泡灭了,我仔细检查,没有发现问题。重新按下开关,灯泡忽闪两下又暗了,看来不是故障,而是灯泡跟我耍脾气。 于是我问...

  • 灯泡开关

    灯泡开关 在这个问题中,我们能够首先想到的就是使用暴力模拟。根据模拟可以直接模拟每一步的操作。但是这会发生TLE错...

  • 灯泡开关

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/bulb-s...

  • 堆肥|漏电保护开关

    房间灯泡坏了,开关来回几次,保险丝烧了,家里突然一片漆黑,正想找光源解决这个问题,就恢复正常,这是漏电保护开关起...

  • 简单电路图

    原理:在灯泡的两端加上一定的电压,灯泡就可以发光。 材料 灯泡,底座,电池,导线,开关。 图片

  • 电气知识之电路与电路图基础

    如上图,所展示的是一个简单的实物电路,该电路由电池(电源)、开关、导线和灯泡组成。电源的作用是提供电能;开关和导线...

  • 开关、电线与灯泡

    晚上,主人回到家,”啪”的一声打开了开关,有了电线的帮助,灯泡马上就亮了。就这样,开关、电线与灯泡,三个小伙伴一起...

  • LeetCode | 1375. Bulb Switcher I

    LeetCode 1375. Bulb Switcher III灯泡开关 III【Medium】【Python】【...

网友评论

      本文标题:设计模式 · 开关和灯泡的问题

      本文链接:https://www.haomeiwen.com/subject/xmbbrctx.html