策略模式接口和抽象类的简单实现

本文通过一个吃喝嫖赌的场景,探讨如何使用策略模式来简化代码。作者首先展示了直接实现的繁琐方式,然后用抽象类继承和私有内部类的方式改进,最后提出在同一class内,接口实现是最简洁的策略模式应用。文章旨在通过实例体验接口与抽象类在实际问题中的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写代码的时候看到同一个class中用内部接口实现各种业务操作的例子,感到很新奇,就尝试着自己写一下

自编自导了一个吃喝嫖赌的场景:假设做吃喝嫖赌四个操作的时候,都需要先挣钱,然后点单,然后享用,然后结算。除了挣钱这个操作,是独立于吃喝嫖赌本身,有共通性,点、品、结三个动作在不同场景下区别很大,所以需要各自不同的实现

先用最土的方法实现

public class CommonApproach {
    public void eat() {
        earn();
        orderForEat();
        enjoyForEat();
        checkoutForEat();
    }

    public void drink() {
        earn();
        orderForDrink();
        enjoyForDrink();
        checkoutForDrink();
    }

    public void prostitute() {
        earn();
        orderForProstitute();
        enjoyForProstitute();
        checkoutForProstitute();
    }

    public void gamble() {
        earn();
        orderForGamble();
        enjoyForGamble();
        checkoutForGamble();
    }

    private void earn() {
    }

    private void orderForEat() {
    }

    private void enjoyForEat() {
    }

    private void checkoutForEat() {
    }

    private void orderForDrink() {
    }

    private void enjoyForDrink() {
    }

    private void checkoutForDrink() {
    }

    private void orderForProstitute() {
    }

    private void enjoyForProstitute() {
    }

    private void checkoutForProstitute() {
    }

    private void orderForGamble() {
    }

    private void enjoyForGamble() {
    }

    private void checkoutForGamble() {
    }
}

明显过于繁琐,不会写代码的看了都会觉得很累赘,那么再试着用abstract类继承的方式实现,由于这里要求在一个class里完成,那么就用私有内部类来搞一下:

public class AbstractApproach {

    private DoEDPG behaviour;

    public void eat() {
        behaviour = new DoEDPG() {
            @Override
            protected void order() {
                JoePrint.print("order food");
            }

            @Override
            protected void enjoy() {
                JoePrint.print("enjoy the food");
            }

            @Override
            protected void checkout() {
                JoePrint.print("pay for the food");
            }
        };
        behaviour.earn();
        behaviour.order();
        behaviour.enjoy();
        behaviour.checkout();
    }

    public void drink() {
        behaviour = new DoEDPG() {
            @Override
            protected void order() {
                JoePrint.print("order drink");
            }

            @Override
            protected void enjoy() {
                JoePrint.print("enjoy liquid");
            }

            @Override
            protected void checkout() {
                JoePrint.print("pay for the liquid");
            }
        };
        behaviour.earn();
        behaviour.order();
        behaviour.enjoy();
        behaviour.checkout();
    }

    public void prostitute() {
        behaviour = new DoEDPG() {
            @Override
            protected void order() {
                JoePrint.print("order someone or several");
            }

            @Override
            protected void enjoy() {
                JoePrint.print("enjoy with him/her/them");
            }

            @Override
            protected void checkout() {
                JoePrint.print("pay for him/her/them");
            }
        };
        behaviour.earn();
        behaviour.order();
        behaviour.enjoy();
        behaviour.checkout();
    }

    public void gamble() {
        behaviour = new DoEDPG() {
            @Override
            protected void order() {
                JoePrint.print("order token");
            }

            @Override
            protected void enjoy() {
                JoePrint.print("gamble");
            }

            @Override
            protected void checkout() {
                JoePrint.print("checkout");
            }
        };
        behaviour.earn();
        behaviour.order();
        behaviour.enjoy();
        behaviour.checkout();
    }

    private abstract class DoEDPG {

        protected void earn() {
            JoePrint.print("earn money");
        }

        abstract protected void order();

        abstract protected void enjoy();

        abstract protected void checkout();
    }
}

然后用接口实现,也是我认为在同一个class内部实现的最简洁方式:

public class InterfaceApproach {

    public void eat() {
        doEDPG(new IDo() {
            @Override
            public void order() {
                JoePrint.print("order food");
            }

            @Override
            public void enjoy() {
                JoePrint.print("enjoy the food");
            }

            @Override
            public void checkout() {
                JoePrint.print("pay for the food");
            }
        });
    }

    public void drink() {
        doEDPG(new IDo() {
            @Override
            public void order() {
                JoePrint.print("order drink");
            }

            @Override
            public void enjoy() {
                JoePrint.print("enjoy liquid");
            }

            @Override
            public void checkout() {
                JoePrint.print("pay for the liquid");
            }
        });
    }

    public void prostitute() {
        doEDPG(new IDo() {
            @Override
            public void order() {
                JoePrint.print("order someone or several");
            }

            @Override
            public void enjoy() {
                JoePrint.print("enjoy with him/her/them");
            }

            @Override
            public void checkout() {
                JoePrint.print("pay for him/her/them");
            }
        });
    }

    public void gamble() {
        doEDPG(new IDo() {
            @Override
            public void order() {
                JoePrint.print("order token");
            }

            @Override
            public void enjoy() {
                JoePrint.print("gamble");
            }

            @Override
            public void checkout() {
                JoePrint.print("checkout");
            }
        });
    }

    private void doEDPG(IDo iDo) {
        earn();
        iDo.order();
        iDo.enjoy();
        iDo.checkout();
    }

    private void earn() {
        JoePrint.print("earn money");
    }

    private interface IDo {

        void order();

        void enjoy();

        void checkout();
    }

}

当然这里讨论的场景很狭隘,至于接口和抽象方法在策略模式下的优劣长短,需要在以后的工作中继续体会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值