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

三、小结

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

相关推荐
头发还在的女程序员3 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats4 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123454 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
AI大法师5 小时前
一个机场如何被做成 IP 场景:宝可梦机场的设计方法总结
大数据·人工智能·设计模式·新媒体运营
都叫我大帅哥7 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.7 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔8 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊9 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
晚安code9 小时前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
景同学10 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端