策略模式—Java实现

1. 现实需求

本人现在负责开发和维护考核督办系统,其中一个模块叫编写工作计划。是工作计划就要有时间,我们的各种提醒都做了,但是还是有人把x月的工作计划内容写到y月,真心无语了!可能有人会说,让客户直接把错误的工作计划全部修改正确不就行了,但是你想客户会愿意吗?客户永远是想做最少的事带来最多的效果。

好吧,那就是直接修改时间。这时问题来了,如果你修改的时间下,已经有了工作计划怎么办?是覆盖,还是合并,还是……。这时我们需要给客户提供策略供其选择。当然,具体业务还有很多限制,这里不具体描述了。可能我们没有想全所有的情况,或客户有了新的需求,这时我们直接新增策略即可,改很少的代码。基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合。

2. 策略模式定义

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

3. 设计原则
      设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口然后在类中包  含这  个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。 
      策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响
到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

4. 策略模式中有三个对象:
(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2) 抽象策略对象:它可由接口或抽象类来实现。
(3)  具体策略对象:它封装了实现同不功能的不同算法。
    利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

5. 为了方便大家理解,还是我们以大多网络上的实例讲解。

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开能解决棘手问题,嘿,还别说,真解决了大问题,搞到最后是周瑜陪了夫人又折兵,那咱们先看看这个场景是什么样子的。

先说说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是亮哥给的,妙计放在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊取出妙计,执行,然后获胜。用java程序怎么表现这些呢?

类图:

项目结构:

具体代码

package chengxuyuanzhilu.com.sp;

/**
* @author 微信公众号:程序员之路
* 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。
*/
public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法。
public void operate();
} package chengxuyuanzhilu.com.sp.imp; import chengxuyuanzhilu.com.sp.IStrategy; /**
* @author 微信公众号:程序员之路
* 找乔国老帮忙,使孙权不能杀刘备
*/
public class BackDoor implements IStrategy { @Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");
} } package chengxuyuanzhilu.com.sp.imp; import chengxuyuanzhilu.com.sp.IStrategy; /**
* @author 微信公众号:程序员之路
* 孙夫人断后,挡住追兵
*/
public class BlackEnemy implements IStrategy { @Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵...");
} } package chengxuyuanzhilu.com.sp.imp; import chengxuyuanzhilu.com.sp.IStrategy; /**
* @author 微信公众号:程序员之路
* 求吴国太开个绿灯
*/
public class GivenGreenLight implements IStrategy { @Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行!");
} } package chengxuyuanzhilu.com.sp; /**
* @author 微信公众号:程序员之路
* 放策略的锦囊
*/
public class Context {
//接口的好处就在于它可以指向实现了它的任意实现类
private IStrategy strategy; //通过锦囊的构造函数,去指定具体要选择哪条策略去处理遇到的危险
public Context(IStrategy strategy) {
this.strategy = strategy;
} public void operate(){
this.strategy.operate();
}
} package chengxuyuanzhilu.com.sp; import chengxuyuanzhilu.com.sp.imp.BackDoor;
import chengxuyuanzhilu.com.sp.imp.BlackEnemy;
import chengxuyuanzhilu.com.sp.imp.GivenGreenLight; /**
* @author 微信公众号:程序员之路
* 赵云就是我们现实生活中的客户
*/
public class ZhaoYun {
/**
* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
*/
public static void main(String[] args) {
Context context; //刚到吴国的时候拆开第一个
System.out.println("----------刚刚到吴国的时候拆开第一个---------------");
context = new Context(new BackDoor());
context.operate();//拆开执行
System.out.println("\n"); //当刘备乐不思蜀时,拆开第二个
System.out.println("----------刘备乐不思蜀,拆第二个了---------------");
context = new Context(new GivenGreenLight());
context.operate();//拆开执行
System.out.println("\n"); //孙权的小追兵了,咋办?拆开第三个锦囊
System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");
context = new Context(new BlackEnemy());
context.operate();//拆开执行
System.out.println("\n");
} }

执行结构:

策略模式-Java实现的更多相关文章

  1. 设计模式之第8章-策略模式(Java实现)

    设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...

  2. 策略模式—Java实现(转)

    1. 现实需求 客户有了新的需求,这时我们直接新增策略即可,改很少的代码.基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合. 2. 策略模式定义 策略模式,又叫算法簇 ...

  3. 策略模式--Java篇

    策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 下面将以商场打折为例子,说明策略模式.商场收银如何促销,用打折还是 ...

  4. StrategyPattern(策略模式)-----Java/.Net

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  5. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  6. JDK设计模式之——策略模式(Comparable和Comparator接口)

    策略模式:其实就是java的多态...父类引用指向子类对象. 使用策略模式,改善排序算法上文中需要排序的是一个数组 让他可以对任何类型的数组进行排序 1.利用 接口 Comparable<T&g ...

  7. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  8. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  9. Java设计模式1——策略模式(Strategy Pattern)

    最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...

随机推荐

  1. 架构私用Nuget服务器

    1.新建一个空的asp.net站点 2.通过nuget引用 Nuget.Server程序集,引用后项目会多出一些文件.修改web.config 里的apikey为你要上传包时用的apikey,我的为: ...

  2. 20145310《Java程序设计》第5次实验报告

    20145310<Java程序设计>第5次实验报告 实验要求 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验内容 根据所学内容,编写代码实现服务器与客户端 掌 ...

  3. Java -D命令对应的代码中获取-D后面的参数 和 多个参数时-D命令的使用

    1. Java代码: public class TestDPara { public static void main(String[] args) { String flag = System.ge ...

  4. ArrayBlockingQueue,LinkedBlockingQueue分析

    BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会 ...

  5. maven问题:如何启动maven项目

    maven是项目构建工具,用于解决jar间的依赖,启动maven项目的命令:tomcat:run 步骤如下: 1.在pom.xml文件中配置插件,此处配置的是tomcat8 2.右击项目名,找到Run ...

  6. shiro对事务的影响

    记一个 No transaction aspect-managed TransactionStatus in scope 错误的解决方法 昨天出现一个BUG,事务没有加回滚成功,修改管理员密码事务没有 ...

  7. Linux 服务器buff/cache清理

    使用Top命令查看内存及缓冲区使用情况 当磁盘频繁产生IO时会导致buff/cache占用很高的内存,导致可用物理内存很少 但是当真正需要内存时,缓冲区内存会自动释放. 如果需要清理可以用 cache ...

  8. gulp构建例子(ubuntu)

    1.项目结构和生产之后的目录 2.gulpfile.js // 载入插件 var gulp = require('gulp'), //本地安装gulp所用到的地 sass = require('gul ...

  9. 编程之美——求1~N的整数中1的个数

    为了依次求个位,十位,百位中1的个数,我们可以把这个数字分为三部分,高位数字,当前位数字,低位数字. 如果当前位为0,那么此位为1的数目与高位数字有关 如果当前位为1,那么此位为1的数目与高位和地位都 ...

  10. Kubernetes 部署失败的 10 个最普遍原因

    [原文].后面我们可能还会看到一个 OOMKilled 错误. 我们的应用正在挂掉?为什么? 首先我们查看应用日志.假定你发送应用日志到 stdout(事实上你也应该这么做),你可以使用 kubect ...