策略模式(Strategy Pattern) 具体解释

本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879

本文版权全部, 禁止转载, 如有须要, 请站内联系.

策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户.

对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式;

使用set()方法, 又一次设定接口的行为. 提供行为的调用的方法(如perform), 须要调用接口(interface)的固有方法(fly & quack)就可以.

代码:

package strategy;

public abstract class Duck { //抽象类
FlyBehavior flyBehavior;
QuackBehavior quackBehavior; public Duck() { //构造函数
} public abstract void display(); //抽象函数 public void performFly() {
flyBehavior.fly();
} public void performQuack() {
quackBehavior.quack();
} public void swim() {
System.out.println("All ducks float, even decoys! ");
} public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
} public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
}

FlyBehavior 和 QuackBehavior是两个接口(interface), 包括方法fly()和quack();

继承接口的方法, 都必须使用fly()和quack()的方法;

代码:

/**
* @time 2014.5.22
*/
package strategy; /**
* @author C.L.Wang
*
*/
public interface FlyBehavior {
public void fly();
}
/**
* @time 2014.5.22
*/
package strategy; /**
* @author C.L.Wang
*
*/
public interface QuackBehavior {
public void quack();
}

接口的实现.

代码:

/**
* @time 2014.5.22
*/
package strategy; /**
* @author C.L.Wang
*
*/
public class FlyNoWay implements FlyBehavior { /* (non-Javadoc)
* @see strategy.FlyBehavior#fly()
*/
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can't fly! ");
} }
/**
*
*/
package strategy; /**
* @author Administrator
*
*/
public class FlyRocketPowerd implements FlyBehavior { /* (non-Javadoc)
* @see strategy.FlyBehavior#fly()
*/
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying with a rocket! ");
} }
/**
*
*/
package strategy; /**
* @author Administrator
*
*/
public class FlyRocketPowerd implements FlyBehavior { /* (non-Javadoc)
* @see strategy.FlyBehavior#fly()
*/
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying with a rocket! ");
} }
/**
*
*/
package strategy; /**
* @author Administrator
*
*/
public class MuteQuack implements QuackBehavior { /* (non-Javadoc)
* @see strategy.QuackBehavior#quack()
*/
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("<< Silence >>");
} }
/**
*
*/
package strategy; /**
* @author Administrator
*
*/
public class Quack implements QuackBehavior { /* (non-Javadoc)
* @see strategy.QuackBehavior#quack()
*/
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack! ");
} }
/**
*
*/
package strategy; /**
* @author Administrator
*
*/
public class Squeak implements QuackBehavior { /* (non-Javadoc)
* @see strategy.QuackBehavior#quack()
*/
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Squeak");
} }

继承父类的子类, 仅仅须要指定所使用的行为(即 接口(interface)的实现)的类型, 并提供自己的display()函数就可以;

代码:

/**
*
*/
package strategy; /**
* @author Administrator
*
*/
public class MallardDuck extends Duck { public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
} /* (non-Javadoc)
* @see strategy.Duck#display()
*/
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("I'm a real Mallard duck! ");
} }
/**
*
*/
package strategy; /**
* @author Administrator
*
*/
public class ModelDuck extends Duck { public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
} /* (non-Javadoc)
* @see strategy.Duck#display()
*/
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("I'm a model duck. ");
} }

运行时, 仅仅须要运行各个子类继承父类的方法(perform), 就可以, 也能够使用set()方法改变其行为;

代码:

/**
*
*/
package strategy; /**
* @author Administrator
*
*/
public class MiniDuckSimulator { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly(); Duck model = new ModelDuck();
model.performFly();
model.performQuack(); model.setFlyBehavior(new FlyRocketPowerd());
model.performFly();
} }

面向对象的原则:

1. 封装变化的部分;

2. 多用组合, 少用继承;

3. 针对接口编程, 不针对实现编程;

设计模式 - 策略模式(Strategy Pattern) 具体解释的更多相关文章

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

    写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...

  2. C#设计模式——策略模式(Strategy Pattern)

    一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...

  3. 24种设计模式-策略模式(Strategy Pattern)

    一.优点: 1. 策略模式提供了管理相关的算法族的办法.策略类的等级结构定义了一个算法或行为族.恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码. 2. 策略模式提供了可以替换继承关系的 ...

  4. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  5. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  6. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  7. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

  8. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  9. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

随机推荐

  1. 如何写mysql的定时任务

     什么是事件: 一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的,事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行: 查看是否开启: show variables li ...

  2. Missing artifact com.sun:tools:jar:1.5.0的解决方案

    今天在用maven的时候遇到一个问题pom.xml提示Missing artifact com.sun:tools:jar:1.5.0 试过改eclipse的eclipse.ini文件,也试过在ecl ...

  3. 根据block取出页号buf_block_get_page_no

    /*********************************************************************//** Gets the page number of a ...

  4. [原]Unity3D深入浅出 - 认识开发环境中的GameObject菜单栏

    Create Empty:创建空对象 Create Other:创建其他对象 Particle System:创建粒子系统 Camera:创建相机 GUI Text:GUI文本 GUI Texture ...

  5. 【转】目前最细致清晰的NSDictionary以及NSMutableDictionary用法总结 -- 不错

    原文网址:http://www.cnblogs.com/wengzilin/archive/2012/03/15/2397712.html 做过Java语言 或者 C语言 开发的朋友应该很清楚 关键字 ...

  6. java.lang和java.lang.annotation中实现Annotation的类小结

    加了注解,等于打上了某种标记,没加,则等于没有某种标记,以后,其他程序可以用反射来了解你的类上面有无何种标记,看你有什么标记,就去干相应的事.标记可以加在类,方法,字段,包上,方法的参数上. (1)  ...

  7. [GRYZ2015]足球联赛

    问题描述 巴蜀中学新一季的足球联赛开幕了.足球联赛有n 只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得3 分,输一场不得分,平局两只队伍各得一分.英勇无畏的小鸿是机房的主力前锋 ...

  8. bzoj 2588 Spoj 10628. Count on a tree(主席树)

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  9. Python引用传值总结

    Python函数的参数传值使用的是引用传值,也就是说传的是参数的内存地址值,因此在函数中改变参数的值,函数外也会改变. 这里需要注意的是如果传的参数类型是不可改变的,如String类型.元组类型,函数 ...

  10. 单节点伪分布集群(weekend110)的HBase子项目启动顺序

    伪分布模式下,如(weekend110)hbase-env.sh配置文档中的HBASE_MANAGES_ZK的默认值是true,它表示HBase使用自身自带的Zookeeper实例.但是,该实例只能为 ...