首页 > 其他分享 >学习记录-策略模式

学习记录-策略模式

时间:2023-01-12 18:35:48浏览次数:80  
标签:10 策略 记录 int 模式 Context public num1

策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

介绍

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算·法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。4、洗衣机你可以选择标准模式、快洗模式、浸洗、大物模式。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

实现

我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。

StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。

image-20230112181929679

代码实现

public class Main {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }

    //创建一个策略接口
    //注:这里static修饰只是因为在main函数里调用了相关函数,并无其它意义。
    public interface Strategy {
        public int doOperation(int num1, int num2);
    }

    //创建实现接口的实体类。
    //注:这里static修饰只是因为在main函数里调用了相关函数,并无其它意义。
    public static class OperationAdd implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
            return num1 + num2;
        }
    }
    public static class OperationSubtract implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
            return num1 - num2;
        }
    }
    public static class OperationMultiply implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
            return num1 * num2;
        }
    }

    //创建 Context 类
    //注:这里static修饰只是因为在main函数里调用了相关函数,并无其它意义。
    public static class Context {
        private Strategy strategy;

        public Context(Strategy strategy){
            this.strategy = strategy;
        }

        public int executeStrategy(int num1, int num2){
            return strategy.doOperation(num1, num2);
        }
    }
}

运行结果

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

此文章参考:

【菜鸟教程】:https://www.runoob.com/design-pattern/strategy-pattern.html
【五分钟学设计模式.10.策略模式-哔哩哔哩】: https://b23.tv/1YEPINB

标签:10,策略,记录,int,模式,Context,public,num1
From: https://www.cnblogs.com/galo/p/17047623.html

相关文章

  • kafka(kraft模式)3.*集群容器部署 docker-compose
    一、创建yml文件要修改部分1.修改宿主机ipKAFKA_CFG_ADVERTISED_LISTENERS2.修改挂载路径version:"3.6"services:kafka1:container_name:kafka1image:......
  • freeswitch的多租户模式
      概述freeswitch是一款简单好用的VOIP开源软交换平台。现在的VOIP服务越来越倾向于云端服务,包括呼叫中心云服务,线路云平台。而云平台对多个客户的服务就需要做好......
  • 学习记录-状态模式
    状态模式在状态模式(StatePattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象......
  • 记录--Vue开发历程---音乐播放器
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、audio标签的使用1、Audio对象属性 2、对象方法二、效果效果如下:三、代码代码如下:MusicPla......
  • 微信小程序图片显示模式
     ......
  • 【一句话】Redis的3中缓存策略
    首先一句话:旁路缓存模式策略:写->写DB,删缓存,读->读cache,没有则读DB,然后更新到缓存读写穿透策略:写->写缓存,然后由缓存系统写DB,读->读cache,没有则将DB写入cache,再读cache异......
  • 11.(结构型模式)java设计模式之外观(门面)模式
    一、什么是外观(门面)模式 二、外观(门面)模式的实现方式模式结构分析:类关系图:统一模型:代码实现:测试用例:测试结果:方法评估:优点:缺点:三、JAVA知识点四.汇总......
  • 2019 ICPC Shanghai Site记录
    K-ColorGraph发现\(n\)只有\(16\),可以爆搜!考虑到无奇环和二分图互为充要条件,只要暴力枚举在二分图左边还是右边,根据定义看最多能保留多少条边就可以了!查看代码#in......
  • 日常开发记录-this.$message,this.$prompt,交换弹窗确定和取消按钮的位置,确定在左,取消
    代码:<template><el-buttontype="text"@click="open">点击打开MessageBox</el-button></template><script>exportdefault{methods:{open(){......
  • Spring AOP 切面记录操作日志
    前言实际业务,有时候需要记录服务的操作日志,我们可以利用SpringAOP切面来拦截记录用户操作;用户使用session或者前端传值都可以。1.创建日志记录接口首先我们得有一个......