文档章节

【行为型】- 策略模式

ZeroneLove
 ZeroneLove
发布于 02/23 11:20
字数 575
阅读 24
收藏 0

策略模式

定义一组算法,将每个算法封装起来并且使得他们之间可以互换 策略模式使客户端调用他们时算法发生互不影响的变化

角色

  • 抽象策略角色:策略类,通常由一个接口或者抽象类实现
  • 具体策略角色:包装相关的算法和行为
  • 环境角色:持有策略类的引用(本质接口),最终给客户端调用

抽象策略角色:Strategy

public interface Strategy {
    public void Sort(List<Integer> list);
    public void show(List<Integer> list);
}

具体策略角色:ConcreteStrategy

public class ConcreteStrategy implements Strategy {

    /**
    * 数组排序的策略:冒泡排序:升序
    */
    @Override
    public void Sort(List<Integer> list) {

        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.size() - 1 - i; j++) {
                int temp01 = list.get(j);
                int temp02 = list.get(j + 1);
                if (temp01 > temp02) {
                    list.set(j, temp02);
                    list.set(j + 1, temp01);
                }
            }
        }
    }

    /**
    * 具体遍历数组的策略方法
    */
    @Override
    public void show(List<Integer> list) {
        for(Integer integer : list){
            System.out.println(integer);
        }
    }
}

环境角色:Environment

public class Environment {

    private ArrayList<Integer> list=new ArrayList<Integer>();

    /**环境引用的策略*/
    private Strategy strategy;

    public void setStrategy(Strategy strategy){
        this.strategy = strategy;
    }

    /**
        * 策略:遍历数组
        */
    public void show(){
        this.strategy.show(list);
    }

    /**
        * 使用指定的策略进行排序
        */
    public void sort(){
        this.strategy.Sort(list);
    }

    public void add(int i){
        list.add(i);
    }
}

测试代码

Environment environment=new Environment();  //实例化策略环境
environment.add(1);
environment.add(8);
environment.add(5);
environment.add(6);

//设置具体的具体策略类
environment.setStrategy(new ConcreteStrategy());
environment.show();

System.out.println("-----------------排序后----------------");

environment.sort();
environment.show();

通俗解释:

广州->深圳

客户从广州去深圳,因为路途比较短,可选择高铁、汽车、大巴等方式,其中“广州->深圳”,就是抽象策略接口规定的方法,高铁、汽车、大巴则是实现抽象策略的具体不同实现,广州市和深圳市则是具体的环境角色,他能满足“广州->深圳”的需求,至于客户则是环境角色内部处理的对象,根据不同的方式有不同的实现策略

© 著作权归作者所有

ZeroneLove
粉丝 5
博文 164
码字总数 133695
作品 0
深圳
高级程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.4K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
171
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
134
7
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
18
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部