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

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

作者: 单名一个冲 | 来源:发表于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();
            }
        }
    }
    

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

    相关文章

      网友评论

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

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