设计模式之策略模式

fengshenjingjun fengshenjingjun     2022-10-02     518

关键词:

  软件工程师都会学习设计模式,设计模式可以说是前人智慧与经验的结晶,虽然不是哪里都用得到,但是在合适的地方使用合适的设计模式,能够带来巨大的收益。我通过学习《head first 设计模式》,逐渐掌握这些设计方法,本篇是对于策略模式的一点心得。

  策略模式是对算法的包装,是把使用算法的类和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。这样能够很灵活地操作这些方法,通过修改不同子类中的算法就可以达到对应的效果。举个例子,现在有一个Bird类,我们需要的是各种鸟的实例来操作它们。假设Bird这个类有两个个行为,fly和swim,而且show是都有的行为,但是每个子类的show又不一样,那么这么写:

abstract class Bird{
    void fly(){System.out.println("fly...");}void swim(){System.out.println("swim...");}
abstract void show();

}

  看起来没问题,现在业务需要的子类大雁、翠鸟等都妥妥的满足了。然而由于业务扩大,现在需要鸟类实现一个捕食方法,由于觉得所有鸟类都会捕食,而且捕食对象不相同,于是添加了prey的抽象方法,在子类中重载这个方法。后来,业务继续扩大,公司又添加了鸡这个子类,但是这个鸡并不需要捕食,这样一来,就出问题了。强行重载prey方法,然后在里面什么也不做,这显然不是一个明智的方法,那么把prey方法拿走,另外写一个接口Iprey,需要捕食的类就去实现这个接口怎么样,这样子的话,每个子类都要写一个自己的捕食方法,假如捕食方法有变动,所有需要捕食的子类都要改代码,这样也不是个事儿。

  在这里的设计原则有:1、尽量把代码变和不变的部分分割开来;2、针对接口编程,而不是针对实现编程;这里的接口的真正意义是超类型,针对接口编程的真正意义在于多态,利用多态,程序可以针对超类型编程,执行时可以根据实际情况执行到真正的行为,而不会绑死在超类型的行为上。

  于是我们在Iprey接口的基础上,设计了两个类来实现这个接口,其中一个类PreyBehavior,另一个类NoPrey,分别在两个类里有捕食方法和不捕食的方法:

public interface Iprey{
    void prey();
}

class PreyBehavior{
     void prey(){
        System.out.println("prey...");     
    }
}

class NoPrey{
     void prey(){
        System.out.println("No prey...");     
    }
}

现在就可以整合一下Bird的行为了:

public abstract class Bird {
    Iprey preyBehavior;

    void fly() {
        System.out.println("fly...");
    }

    void swim() {
        System.out.println("swim...");
    }
    void performPrey(){
        preyBehavior.prey();
    }
    abstract void show();
}

我们在Bird类里面呢加了个performPrey方法,里面有一个preyBehavior对象,这么做可以让子类选择怎样实现prey方法:

public class Duck extends Bird{
    public Duck(){
        preyBehavior = new NoPrey();
    }
    
    @Override
    void show() {
        System.out.println("duck...");
    }


}

当然,我们可以在Bird类里面加上setPreyBehavior方法来动态控制Prey的动作,这个不提。

设计模式之策略模式

策略模式属于对象行为型的设计模式定义:封装了一些列算法,它们之前可以相互替换,此模式使得算法的改变,不会影响到使用它们的客户端  策略模式有以下3个角色组成抽象策略类:所有策略类的父类,为所支持的... 查看详情

《设计模式之禅》之策略模式

一、策略模式的定义策略模式是一种比较简单的模式,也叫做政策模式,其定义如下:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使用的是面向对象的继承和多态机制,我们看看策略模式的三个... 查看详情

设计模式之策略模式

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

设计模式之策略模式

...,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。介绍意图... 查看详情

015设计模式之策略模式

抽象策略角色:策略类,通常由一个接口或者抽象类实现。-具体策略角色:包装了相关的算法和行为。-环境角色:持有一个策略类的引用,最终给客户端调用。 #pragmaonce//策略接口(纯虚函数)classIStrategypublic: IStrategy() virtual~IStrate... 查看详情

大话设计模式之策略模式

策略模式  定义了一系列的算法,分别封装起来,让他们之间可以互相替换。此模式让算法的改变不会影响到使用算法的客户。  在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对... 查看详情

设计模式之策略模式

  软件工程师都会学习设计模式,设计模式可以说是前人智慧与经验的结晶,虽然不是哪里都用得到,但是在合适的地方使用合适的设计模式,能够带来巨大的收益。我通过学习《headfirst设计模式》,逐渐掌握这些设计方法,... 查看详情

java设计模式之策略模式

    策略模式属于对象的行为模式,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式使这些算法在客户端调用它们... 查看详情

java设计模式之策略模式

...此模式让算法的变化,不会影响到使用算法的客户(大话设计模式)。策略模式UML图      策略模式代码   古代的各种计谋都是一种策略,这次我们的例子就拿其中一种离间计来写的,理解起来非常容易,代码... 查看详情

设计模式之策略模式20170720

行为型设计模式之策略模式:一、含义策略模式是一种比较简单的模式,也叫做政策模式,其定义如下:定义一组算法(可抽象出接口),将每个算法都封装起来,并且使它们之间可以互换(定义一个类实现封装与算法切换) 二、... 查看详情

设计模式之-策略模式(strategypattern)(代码片段)

...,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。 C++实... 查看详情

设计模式之策略模式(代码片段)

设计模式之策略模式  策略模式(StraregyPattern)是一种比较简单的模式,也叫政策模式(PolicyPattern),定义如下:Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeable.(定义一组算法,将每个算法都封装起来,并... 查看详情

设计模式之策略模式

目录 策略模式介绍鸭子事例简单的鸭子会飞的鸭子橡皮鸭登场噩梦开始策略模式鸭子策略模式介绍策略模式就是将功能定义为算法簇,分别封装起来,让他们之间可以替换,此模式可以让算法的变化独立于使用算法... 查看详情

设计模式之策略模式

设计模式之策略模式Jul23,2015策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。正文在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数... 查看详情

java设计模式之策略模式

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

设计模式:helloworld之策略模式

一.概述策略模式定义了算法族,分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式的三要素:抽象策略角色:策略类,通常由一个接口或者抽象类实现。具体策略角色:包装了相关的... 查看详情

《设计模式之禅》--策略扩展:策略枚举

接上篇《设计模式之禅》--代理扩展:动态代理需求:加减法计算publicenumCalculator{//加法运算ADD("+"){publicintexec(inta,intb){returna+b;}},//减法运算SUB("-"){publicintexec(inta,intb){returna-b;}};Stringvalue="";//定义成员值类型privateCalculator(S 查看详情

设计模式之桥梁模式和策略模式的差别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式。下面是它们的UML结构图。桥梁模式:策略模式:在桥接模式中,Abstraction通过聚合的方式引用Implementor。举一个样例:策略模式:我要画圆。要实心圆,... 查看详情