博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式系列之策略模式
阅读量:6258 次
发布时间:2019-06-22

本文共 1716 字,大约阅读时间需要 5 分钟。

hot3.png

一、定义

策略模式(Strategy)属于对象行为型设计模式,主要是定义一系列的算法,把这些算法一个个封装成拥有共同接口的单独的类,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。这里的算法不要狭义的理解为数据结构中算法,可以理解为不同的业务处理方法。这种做法会带来什么样的好处呢?它将算法的使用和算法本身分离,即将变化的具体算法封装了起来,降低了代码的耦合度,系统业务策略的更变仅需少量修改。算法被提取出来,这样可以使算法得到重用,这种情况还可以考虑使用享元模式来共享算法对象,来减少系统开销(但要注意使用享元模式的建议条件)。

二、结构

先由定义来想象下它的结构吧:要使算法拥有共同的接口,这样就要实现一个接口或者一个抽象类出来才行。这样基本上轮廓也就出来了,我们来看看吧:
策略模式由三个角色组成:
1) 算法使用环境(Context)角色:算法被引用到这里和一些其它的与环境有关的操作一起来完成任务。
2) 抽象策略(Strategy)角色:规定了所有具体策略角色所需的接口。在java 它通常由接口或者抽象类来实现。
3) 具体策略(Concrete Strategy)角色:实现了抽象策略角色定义的接口。策略模式各个角色之间关系的类图表示:

三、举例

     情景描述:医生针对不同症状的病人开除不同的处方

package com.foreveross.fengshu;/** * @author fengshuzi */public class 策略模式 {    public static void main(String args[]) {        System.out.println("医生我感冒了");        new Context(new Cold()).operate();        System.out.println("医生我头疼");        new Context(new Headache()).operate();        System.out.println("医生我肚子疼");        new Context(new Stomachache()).operate();    }}//医生对症开方子class Context {    public Istrategy istrategy;    public Context(Istrategy istrategy) {        this.istrategy = istrategy;    }    public void operate() {        this.istrategy.treat();    }}interface Istrategy {    public void treat();}class Cold implements Istrategy {    public void treat() {        System.out.println("医生开了一个治感冒的药方");    }}class Headache implements Istrategy {    public void treat() {        System.out.println("医生开了一个治头疼的药方");    }}class Stomachache implements Istrategy {    public void treat() {        System.out.println("医生开了一个治肚子痛的药方");    }}

四、使用建议

下面是使用策略模式的一些建议:

1) 系统需要能够在几种算法中快速的切换。
2) 系统中有一些类它们仅行为不同时,可以考虑采用策略模式来进行重构
3) 系统中存在多重条件选择语句时,可以考虑采用策略模式来重构。但是要注意一点,策略模式中不可以同时使用多于一个的算法。

转载于:https://my.oschina.net/fengshuzi/blog/191772

你可能感兴趣的文章
Swift入门篇-swift简介
查看>>
05 继承
查看>>
弧度和角度的转换
查看>>
[leetcode]Unique Paths II @ Python
查看>>
nginx源码分析之hash的实现
查看>>
数据结构快速回顾——二叉树 解幂子集问题
查看>>
选择排序
查看>>
使用微软 URL Rewrite Module 开启IIS伪静态
查看>>
浅谈UML中类之间的五种关系及其在代码中的表现形式
查看>>
原创:CentOS6.4配置solr 4.7.2+IK分词器
查看>>
cocos2d(3.0)一些基础的东西
查看>>
jQuery动画animate方法使用介绍
查看>>
自适应网页设计(Responsive Web Design)
查看>>
[C#]Hosting Process (vshost.exe)
查看>>
spring beans源码解读之--bean definiton解析器
查看>>
mysql索引优化
查看>>
Async Performance: Understanding the Costs of Async and Await
查看>>
POJ3352Road Construction(构造双连通图)sdut2506完美网络
查看>>
[原]Android打包之跨平台打包
查看>>
Linq的Distinct方法的扩展
查看>>