策略模式—java实现(转)

hadley2012      2022-04-13     316

关键词:

 

1. 现实需求

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

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实现

策略模式简单来说就是将业务和实现业务的具体方法剥离开来依然以仓库拣货来说,合并拣货分单拣货是一种模式,但具体根据所出库单中的品是什么类型,从哪种类型仓库出,还是要有具体的拣货策略来生成拣货列表比如服装... 查看详情

策略设计模式详解c/java/js/go/python/ts不同语言实现

简介策略模式(StrategyPattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。当你想使用对象中各种不同的算法变体,使用if...else所带来的复杂和难以维护... 查看详情

java策略设计模式

1、概述   策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。   实际上不要被晦涩难懂的定义迷惑,其实策略设计模式就是定义... 查看详情

java策略模式与接口直接实现

java策略模式例子:https://www.cnblogs.com/java2016/p/5386615.htmlContextcontext=newContext(newAddStrategy());System.out.println(context.calculate(10,5));与Strategys=newAddStrategy();s.calcuate(10,5);的优劣怎么比较?谢谢!我是一个java初学者,我下面写的东西都是我... 查看详情

设计模式中的多态——策略模式详解(代码片段)

目录1.关于策略模式2.策略模式详解2.1策略模式定义2.2策略模式的UML类图3.策略模式的优点3.1一个使用策略模式的例子3.2与其他实现方式的对比3.3使用策略模式的优点4.使用工厂方法模式改进原有策略模式5.总结5.参考资料1.关于策... 查看详情

java设计模式7.策略模式模板方法模式观察者模式

策略模式策略模式的用意,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。环境角色:持有一个抽象策略角色的引用。抽象策略角色:... 查看详情

java设计模式---策略模式(案例解析)

策略模式一、概念1、理解策略模式策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一... 查看详情

java设计模式--策略模式

1.策略模式1.1定义策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。1.2底层机制将有共性的行为抽象为一个接口,其中有此种行为的声明。该接口的实现类都实现... 查看详情

java设计模式—策略模式

  在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模... 查看详情

java策略模式

策略模式策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。这个模式涉及到三个... 查看详情

java设计模式之策略模式

1.策略模式的介绍  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。简单的... 查看详情

10设计模式策略模式

...作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的策略模式的思想,本文主要讲解策略模式。概念... 查看详情

java之策略模式(大话设计模式)

...体验,坚持每天一个设计模式,直到熟练运用设计模式。策略模式定义了很多完成相同工作的算法,但实现不同,它可以以相同的方式调用所有的算法,减少了算法和调用算法的耦合。以下是大话设计模式的策略类图/***上下文*/... 查看详情

java策略模式

模式的定义策略模式定义了一系列的算法,并将每一个算法封装起来,而且它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。使用场景针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。需要安... 查看详情

(转)设计模式——策略模式

.../blog.csdn.net/lifuxiangcaohui/article/details/8065059这篇文章讲述的策略模式非常棒,在此转载。 设计模式;一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂。后来随着软件开发经验的增加才开始明白我... 查看详情

java设计模式1-策略模式

策略模式:分别封装行为接口,实现算法族,超类里放行为的接口对象,在子类里具体设定行为对象.原则就是:分离变化部分,封装接口,基于接口编程各种功能.为什么要用策略模式{继承带来的问题:(为策略模式)对类的局部改动,尤其是... 查看详情

java设计模式之——策略模式

1、策略模式有什么好处?    策略模式的好处在于你可以动态的改变对象的行为。2、设计原则    设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类... 查看详情

java嵌套ifelse优化(代码片段)

文章目录1.传统实现2.策略模式+工厂模式+单例模式优化2.1策略接口2.2不同策略实现类2.2.1处理策略一2.2.2处理策略二2.2.3处理策略三2.2.4处理策略四3.策略工厂4.使用5.参考资料多分支复杂条件嵌套判断会让逻辑变得更加复杂&#... 查看详情