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

三、小结

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

相关推荐
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫4 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp5 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶6 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb