策略模式(简单入门)

原创 2016年05月30日 22:33:06

本博文参考自《Head First 设计模式》
这里并不是讲设计模式一些高深概念的,不喜勿喷!!!!!!


策略模式的定义: 策略模式定义了算法族,分别封装起来,让它们独立于使用算法的客户

下面用一个实例来进行说明:
类的结构图:
这里写图片描述
复制代码:

  Duck类:这个类是所有鸭子子类的父类。
package com.wnl.classes;

import com.wnl.interfaces.FlyBehavior;
import com.wnl.interfaces.QuackBehavior;

/**
 * 
 * 设计原则:
 * 
 * 1:分开变化和不变化部分,把变化部分封装起来 
 * 2:针对接口编程,而不会针对实现编程
 * 3:多用组合,少用继承
 * 
 *     策略模式:
 *              策略模式定义了算法族,分别封装起来,让它们独立于使用算法的客户
 * 
 * @author Administrator
 * 
 * 学习心得:
 * 
 *          在策略模式中,把变化的业务和不变化的分开,独自封装变化的部分,然后交由具体的子类去实现。
 *       在本例,鸭子有不同的种类,不同的行为,不同种类的鸭子对于同一行为的实现又是不一样。所以,为
 *       了提高程序的维护性和代码的复用性,我们把行为(变化的)和Duck父类分开,在Duck父类中提供一
 *       个实现接口方法的方法(performQuack()、performFly() )方便子类调用。由于具体行为的类实现统一的行为接
 *       口,所以子类可以动态调用父类实现接口方法的方法来实现行为。
 *         综合的来说,就是子类需要是实现的方法,在父类中不直接实现,委托其它的类来实现。
 * 
 */
public abstract class Duck {

    public QuackBehavior quackBehavior;
    public FlyBehavior flyBehavior;

    public void performQuack() {

        quackBehavior.quack();

    };

    public void performFly() {

        flyBehavior.fly();

    }
/**
 * 设置改变叫的方法,子类可以动态改变叫的行为
 * @param qb  QuackBehavior对象
 */ 

    public void setQuackBehavior(QuackBehavior qb){
        quackBehavior=qb;
    }
    /**
     * 设置改变飞行的方法,子类可以动态改变飞行的行为
     * @param qb  FlyBehavior对象
     */ 
    public void setFlyBehavior(FlyBehavior fb){
        flyBehavior=fb;
    }


    /**
     * 鸭子的外观
     */
    public abstract void display();

    public void swim(){

        System.out.println("All ducks float, and decoys");

    }

}

实现“飞”的行为的接口
把“飞”的动作从Duck类中抽取出来,定义一个”飞”的动作的接口,而具体“飞”的变现,例如“不会飞”,“会飞”、“飞的很慢”等等,由“飞”的动作的不同子类(实现了统一的“飞”的接口)来实现。这样,以后想添加一个具体的“飞”的行为的时候,就可以不用修改Duck类,实现了低耦合。

package com.wnl.interfaces;

public interface FlyBehavior {

    public void fly();

}

实现“叫”的行为的接口
把“叫”的动作从Duck类中抽取出来,定义一个”叫”的动作的接口,而具体“叫”的变现,例如“不会叫”,“会叫”、“飞的很大声”等等,由“叫”的动作的不同子类(实现了统一的“叫”的接口)来实现。这样,以后想添加一个具体的“叫”的行为的时候,就可以不用修改Duck类,实现了低耦合。

package com.wnl.interfaces;

public interface QuackBehavior {

    public void quack();

}

具体“叫”的行为

package com.wnl.utils;

import com.wnl.interfaces.QuackBehavior;

public class Quack implements QuackBehavior {

    @Override
    public void quack() {
          System.out.println("Quack");      
    }

}
package com.wnl.utils;

import com.wnl.interfaces.QuackBehavior;

public class MuteQuack implements QuackBehavior {

    @Override
    public void quack() {
         System.out.println("<< Slience >>");       
    }

}

具体“飞”的行为

package com.wnl.utils;

import com.wnl.interfaces.FlyBehavior;

public class FlyWithWings implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("I am flying");
    }

}
package com.wnl.utils;

import com.wnl.interfaces.FlyBehavior;

public class FlyRocketPower implements FlyBehavior {

    @Override
    public void fly() {
         System.out.println("I am flying with a rocket");       
    }

}
package com.wnl.utils;

import com.wnl.interfaces.FlyBehavior;

public class FlyNoway implements FlyBehavior {

    @Override
    public void fly() {
             System.out.println("I can not fly");       
    }

}

具体的鸭子子类

package com.wnl.classes;

import com.wnl.utils.FlyWithWings;
import com.wnl.utils.Quack;

public class MallarDuck extends Duck {

    public MallarDuck(){//利用多态向上转型,实例化具体行为
        quackBehavior=new Quack();
        flyBehavior=new FlyWithWings();
    }

    @Override
    public void display() {
      System.out.println("I am a reallyMallarDuck");        
    }
}
package com.wnl.classes;

import com.wnl.utils.FlyNoway;
import com.wnl.utils.Quack;

public class ModelDuck extends Duck {


    public ModelDuck(){//利用多态向上转型,实例化具体行为
        quackBehavior=new Quack();
        flyBehavior=new FlyNoway();
    }


    @Override
    public void display() {
        System.out.println("I am a model duck");
    }

}
package com.wnl.classes;

public class ReaheadDuck extends Duck {

    @Override
    public void display() {
      System.out.println("MallarDuck的外观是红头");       
    }

}

测试类:

package com.test;

import com.wnl.classes.Duck;
import com.wnl.classes.MallarDuck;
import com.wnl.classes.ModelDuck;
import com.wnl.utils.FlyRocketPower;

public class TestDuck {

    public static void main(String[] args) {
         System.out.println("======MallarDuck======");
        Duck mallard = new MallarDuck();
        mallard.performQuack();
        mallard.performFly();
     System.out.println("======ModelDuck======");
        Duck model = new ModelDuck();
        model.performFly();
        model.setFlyBehavior(new FlyRocketPower());
        model.performFly();
    }

}

输出这里写图片描述

至此,所有代码已经完成。从整体上讲,就是抽取变化的部分出来独自封装,这样需求改变的时候,只需要修改抽取出来的代码,父类不会受到影响。整个策略模式可以认为是:抽象出不变的部分,对于需要改变的地方提供一个统一的接口,具体的实现由这个接口的子类去实现。

【量化入门】通过几种常见的量化策略框架,学习量化炒股

阅读原文:http://club.jr.jd.com/quant/topic/1176040 量化选股,就是通过量化思想及配套的计算机程序化来实现选股(如何选择好的股票)和择时(如何在合适的时间...
  • JDquant
  • JDquant
  • 2017年03月15日 20:48
  • 4165

策略模式+简单工厂+反射

策略模式: 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化。不会影响到使用算法的客户 以商店打折为例子: 商店没有做活动,那么收费就是正常收费 商店如果进行活...
  • lypf19900912
  • lypf19900912
  • 2013年04月30日 19:59
  • 2744

三种工厂模式 和 策略模式 对比

一、引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上B...
  • u014600626
  • u014600626
  • 2016年08月05日 17:18
  • 2877

设计模式(14) 策略模式(简单入门 行为模式)

From Now On,Let us begin Design Patterns。策略模式 定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。 Define a family of...
  • yabay2208
  • yabay2208
  • 2017年07月25日 10:27
  • 141

Android策略模式简单Demo

  • 2016年02月20日 21:25
  • 1.22MB
  • 下载

简单工厂和策略模式精华

  • 2012年11月18日 17:22
  • 0B
  • 下载

策略模式的简单例子

  • 2012年04月25日 21:13
  • 11KB
  • 下载

策略模式——小白入门

一、在这里我先简单介绍一下策略模式(Strategy Pattern) 好比如我要去一个地方,由于时间充裕,我可以用乘坐公交车这种策略出行;但是如果时间稍微在紧一点,我就要乘坐地铁这种策略出行;在紧...
  • Yal_insist
  • Yal_insist
  • 2017年01月20日 13:50
  • 171

策略模式(从放弃到入门)

策略模式(来自HeadFirst设计模式)今天看了 Head First 设计模式的第一个模式,居然是策略模式,感觉这种模式很实用,而且书上写了20多页,我这里做一下精简,给大家分享一下,在最后也有一...
  • u013647382
  • u013647382
  • 2016年10月19日 10:45
  • 399

java策略模式简单用例

运用java策略模式一个小程序 /** * */ package Strategy; import java.util.Arrays; /** * @author HuangRong ...
  • u012186491
  • u012186491
  • 2013年10月26日 00:16
  • 605
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:策略模式(简单入门)
举报原因:
原因补充:

(最多只允许输入30个字)