【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();
        }
    }

三、小结

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

相关推荐
叫致寒吧2 小时前
Tomcat详解
java·tomcat
S***26756 小时前
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
java·spring boot·后端
马剑威(威哥爱编程)7 小时前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
JIngJaneIL7 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
V***u4537 小时前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
这是程序猿8 小时前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
i***t9198 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
k***08298 小时前
【监控】spring actuator源码速读
java·spring boot·spring
麦麦鸡腿堡8 小时前
Java_网络编程_InetAddress类与Socket类
java·服务器·网络
vx_dmxq2119 小时前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php