【JAVA】二、设计模式之策略模式

一、简介

设计模式作为一种思维方式,我更喜欢用简单的语言表达,主打思想即可,无需在意实现的编程语言。我认为

策略模式 是利用函数的重写特性来实现多个算法(策略)后,

再利用一个环境类来统一封装,这样使得算法可以独立于用户的使用(环境类)而变化(策略类)的一种思维方式;

二、代码讲解

由于刚好用C#写工具,下面就用C#代码作为展示吧,主要是思维,选择那种编程语言不影响。

csharp 复制代码
 //设置一个策略接口,用于给具体策略来"重写"方法。
    interface Strategy 
    {
        void myExpress();
    }

    //策略A:实现算法方式一
    class A_Strategy : Strategy
    {
        public void myExpress()
        {
            Console.WriteLine("this is a A_Strategy");
        }
    }

    //策略B:实现算法方式二
    class B_Strategy : Strategy
    {
        public void myExpress()
        {
            Console.WriteLine("this is a B_Strategy");
        }
    }

    //策略C:实现算法方式三
    class C_Strategy : Strategy
    {
        public void myExpress()
        {
            Console.WriteLine("this is a C_Strategy");
        }
    }

    //使用环境类进行封装,用户的使用对象
    class Pakagestrategy
    {
        //核心:要想将多个类统一封装,必须使用接口类。
        Strategy strategy;
        public Pakagestrategy(Strategy strategy)
        {
            //核心:通过接口类的重写,这里的对应可以是任意具体策略类的对象
            this.strategy = strategy;
        }

        //核心:利用重写特征,用一个函数PackeMyEpxress,包装了多个myExpress;
        public void PackeMyEpxress()
        {
            this.strategy.myExpress();
        }
    }

    //用户类
    class user
    {
        public void userMethod()
        {
            //用户通过环境类Pakagestrategy来执行对应的算法(策略);
            Pakagestrategy pakagestrategyA = new Pakagestrategy(new A_Strategy());
            pakagestrategyA.PackeMyEpxress();

            //再不改变环境类的情况下,我们可以不断重写更多算法,让用户可以使用一样的接口,但根据参数的不同实现功能多能;
            Pakagestrategy pakagestrategyB = new Pakagestrategy(new B_Strategy());
            pakagestrategyB.PackeMyEpxress();

            Pakagestrategy pakagestrategyC = new Pakagestrategy(new C_Strategy());
            pakagestrategyC.PackeMyEpxress();
        }
    }

三、小结

个人认为,设计模式是一种处理问题的思维方式。更注重的是理解其中变量处理的巧妙之处。不需要太刻意的记住他们的附带属性,比如它是否属于行为模式,还是遵循了什么开闭原则这些。都不是我们的学习重点。去繁化简,灵活运用而不注重形式才是学习之道。

相关推荐
Dicky-_-zhang18 分钟前
系统容量规划与压测实战:从1万到100万QPS的科学扩容
java·jvm
Dicky-_-zhang6 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨6 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
fake_ss1986 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
茉莉玫瑰花茶6 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁6 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
No8g攻城狮7 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
xiaoerbuyu12337 小时前
开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件
java·开发语言
C+++Python8 小时前
C++ 进阶学习完整指南
java·c++·学习