设计模式(一)学习----策略模式

  • 策略设计模式:定义一组算法,将每个算法都分装起来,并使他们之间可以互换。 策略模式就是使用的面向对象思想中的继承和多态的机制

策略模式的通用类图:

  1. Context类:Strategy类,并且和Strategy类是整体和个体的关系,即聚合关系。对策略角色个体进行封装。
  2. Strategy接口:定义这个策略或算法必须有的方法和属性。
  3. ConcreteStrategy1,ConcreteStrategy2具体策略角色实现类。实现抽象策略中的方法,该类中含有具体的算法。

上图变成Java代码:

抽象的策略角色:

package com.lp.ecjtu.strategy1;

public interface Strategy {
    /**
     * 策略模式的运算法则,抽象的策略角色
     */
    public void doSomething();
}

具体的策略角色:

package com.lp.ecjtu.strategy1;

public class ConcreteStrategy1 implements Strategy {

    @Override
    public void doSomething() {
        System.out.println("具体策略1的运算法则");
    }
}

package com.lp.ecjtu.strategy1;

public class ConcreteStrategy2 implements Strategy {

    @Override
    public void doSomething() {
        System.out.println("具体策略2的运算法则");
    }

}

封装角色:

package com.lp.ecjtu.strategy1;

public class Context {
    //抽象策略,与Strategy接口是聚合关系
    private Strategy strategy;
    //构造函数设置具体策略
    public Context(Strategy conStrategy){
        this.strategy = conStrategy;
    }
    //封装后的策略方法
    public void doAnyThing(){
        this.strategy.doSomething();
    }
}

高层模块:

package com.lp.ecjtu.strategy1;

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //声明一个具体的策略,父类的引用指向子类,使用多态
        Strategy strategy = new ConcreteStrategy1();
        Context  context = new Context(strategy);
        context.doAnyThing();

        Strategy strategy2 = new ConcreteStrategy2();
        Context  context2 = new Context(strategy2);
        context2.doAnyThing();
    }

}

策略模式的优点:

  1. 算法可以自由切换:通过Context类对策略成员进行封装,保证对外提供"可自由切换”的策略。
  2. 避免使用多重条件判断,
  3. 扩展性良好

策略模式的缺点:

  1. 策略类数量太多:每一个策略都是一个类,复用性很小,类数量增多。
  2. 所有策略类都需要向外暴露:客户端必须知道有哪些策略才能决定使用哪一个策略。导致封装类没有意义,可以使用工厂模式解决。

应用:

我们假设有如下场景:

我们使用聊天工具聊天时,可以发送点对点消息(私聊)和点对多消息(群聊),而发送不同的消息执行的操作是不一样的,也就是说我们在不同的场景下(私聊或者 群聊)发送消息时会调用不同的发送方法,但是我们只有一个消息发送器(可以理解为发送消息时的发送按钮),我们希望可以通过这消息发送器发送任何类型的消 息。

java代码:

package com.lp.ecjtu.strategy;

public interface IMessage {
    /**
     * ClassName:IMessage
     * Function: 这是一个消息的接口,所有的消息都要实现这个接口.
     * Reason:   TODO ADD REASON.
     * Date:     2014-8-12 上午11:33
     * @author   lipeng
     * @version
     * @since    JDK 1.6
     * @see
     */
    public void send();
}
package com.lp.ecjtu.strategy;

public class P2MMsg implements IMessage {

    @Override
    public void send() {
        // TODO Auto-generated method stub
        System.out.println("这是点对多的消息,将发送给多个人");
    }

}

package com.lp.ecjtu.strategy;

public class P2PMessage implements IMessage {

    @Override
    public void send() {
        // TODO Auto-generated method stub
        System.out.println("这是点对多的消息,将发送给一个人");
    }

}
package com.lp.ecjtu.strategy;

/**
 * 封装角色
 * @author Administrator
 *
 */
public class MessageSender {
    //抽象策略,要使用的消息
    private IMessage message;//与IMessage是聚合关系
    //构造函数设置具体策略,你要使用哪种消息
    public MessageSender(IMessage message){
        this.message = message;
    }

    public void send(){
        this.message.send();
    }
}
package com.lp.ecjtu.strategy;
/**
 * 策略设计模式:定义一组算法,将每个算法都分装起来,并使他们之间可以互换。
 * 策略模式就是使用的面向对象思想中的继承和多态的机制。
 *
 *
 * @author Administrator
 *
 */
public class UserClient {

    /**
     * 依次发送一条点对点的消息,和点对多的消息。
     */
    public static void main(String[] args) {
        //建立发送器
        MessageSender msgSender;
        System.out.println("发送一条点对点的消息:");
        msgSender = new MessageSender(new P2PMessage());
        msgSender.send();
        System.out.println("发送一条点对多的消息:");
        msgSender  = new MessageSender(new P2MMsg());
        msgSender.send();
    }

}

设计模式(一)学习----策略模式

时间: 2024-10-10 02:38:11

设计模式(一)学习----策略模式的相关文章

设计模式进阶(一) 策略模式

摘自<Design Paterns_Elements of Reusable Object-Oriented Software> 上一系列偏重于入门,从本篇开启进阶系列,着重于设计模式的适用情景. 回顾入门系列 设计模式入门(一)  策略模式 1  Intent Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式实现C++ --策略模式Strategy(对象行为型)

1.问题 出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机.每个策略都可以得到相同的结果,但是它们使用了不同的资源.选择策略的依据 是费用,时间,使用工具还有每种方式的方便程度. 2.解决方案 策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想. strategy模式类图: 3.应用场景 1. 

从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看着设计模式中的策略模式

今天重温了一下策略模式,将自己的一些感悟与大家分享...本人只是技术渣渣,所理解的东西的难免会有很大的局限性甚至是错误,还请各位带着批判的眼光去看待....不喜请勿吐槽 定义:策略模式属于设计模式中的对象行为型模式,它将用到的算法单独抽象成一个单独的类.通常,我们在多个类完成同一件事情,仅仅完成的方式不同时,我们可以考虑使用这种设计模式. 举例:相信,很多人在看到"假如有以下几种价格10,20,50,请你代码实现将他们排序输出"这种题目的时候,很快就写出了以下代码,写之前还不忘了问一下

【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这

设计模式-行为型-策略模式

策略模式(Strategy): 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”. 策略模式的角色: 1)环境类(Context):采用组合或聚合的方式维护一个对Strategy对象的引用. 2)抽象策略类(Strategy):定义所有支持的算法的公共接口.Context使用这个接口来调用某Concret

设计模式学习--策略模式

00基础:抽象:继承:封装:多态:00原则:封装变化:多用组合,少用继承:针对接口编程,不针对实现编程:OO模式: 策略模式--定义算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _1.StrategyPatt

设计模式(一):策略模式

一.设计背景 现实生活中,我们要做一件事情或者完成某项工作,往往有很多种途径.比如我们出游,可以选择坐汽车,坐火车,土豪点的选择是坐飞机.还有我们现在线下的支付方式也有了很多种选择,以前在外面忘了带钱的话可能一瓶水都难以买到,现在只要我们手机在身上,可以用微信或者支付宝. 在软件设计层面,我们把各种支付方式叫做策略.如果不考虑设计模式的话,我们可能会在一个类中用if..else方式来选择支付方式,即 if(type == 1){ //微信支付 }else if(type == 2){ // 支付

设计模式第二站--策略模式

从简单工厂模式出发,现在到达第二站:策略模式.那么什么是策略模式,它作为设计模式的第二站和第一站又有怎样的联系或者区别,它的理解和学习能否让我们用到和联系到第一站?怎么个关联法? 别急!下面我们就一起探究,康忙,北鼻! 一.什么是策略模式(Stragety)?          按照书本上的定义来说,策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换:此模式让算法的变化,不会影响到使用算法的用户. 既然是定义都比较抽象,那么就先通过它的结构图来认识一下这个神秘的事物. 也许还是有些抽象