设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(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) 具体解释的更多相关文章
- 设计模式——策略模式(Strategy Pattern)
写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...
- C#设计模式——策略模式(Strategy Pattern)
一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...
- 24种设计模式-策略模式(Strategy Pattern)
一.优点: 1. 策略模式提供了管理相关的算法族的办法.策略类的等级结构定义了一个算法或行为族.恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码. 2. 策略模式提供了可以替换继承关系的 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
随机推荐
- bzoj4028
一眼分块题…… 分块,维护每个块的总的gcd和xor和 先思考我们应该怎么查询,考虑到gcd是一个神奇的东西,因为它最多变化logX次 于是我们从前往后扫描每个块,如果一个块内总的gcd是当前扫描的前 ...
- 常用WEB服务器的特点介绍
经过系统的学习web服务器,现在知道常用的web服务器的优缺点,这对搭建网站架构时选择使用web服务器很有帮助,现在我简单总结一下: 1. Apache:属于重量级web服务器(重量级主要是在软件包的 ...
- 3.2版uploadify详细例子(含FF和IE SESSION问题)
最近做项目中碰到上传需要显示进度的问题,通过uploadfiy很好的解决了这个问题不过(IE9出现了按钮不能点击的问题,至今仍找不到良策) 在使用uploadfiy3.2版本时需要下载jquery.t ...
- (Java)《head first java》值得Java或面向对象基础的新手看。
看完这本书后本人收获良多. 内容对Java以及面向对象的入门者非常友好. 抽象的内容惯用图解的方法来剖析,通俗易懂 之前看C#入门经典的面向对象时,依然浓浓的一头雾水. (1)很不解为何实例化要写成A ...
- error MSB3027: Could not copy "xxx.dll" to "xxx.dll". Exceeded retry count of 10. Failed.
错误提示内容: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3363,5): error MSB302 ...
- UVA 11488-Hyper Prefix Sets(Trie)
题意: 给一个01串的集合,一个集合的幸运值是串的个数*集合中串的最大公共前缀 ,求所有子集中最大幸运值 分析: val[N]表示经过每个节点串的个数求幸运值 求就是每个节点值*该节点的深度 搜一遍树 ...
- e2e 自动化集成测试 环境搭建 Node.js Selenium WebDriverIO Mocha Node-Inspector
Node.js已经出来了许多年载,至今才开始接触.周未在家闲来无事,一时心血来潮,Google了大量的文章,经过实验,终于可以把整个环境给搭起来, 废话不多话,请看步骤. 特别注意, 本文章是针对Wi ...
- js,css压缩工具
常见的js压缩工具: js commpress: 运行平台:windows系统, 优点:能自动压缩: 缺点:不能拖动文件压缩:只支持windows平台: s.press 运行平台:mac ox系统 优 ...
- debian 显示器使用自定义分辨率
比如你要使用 1440x900 的自定义分辨率,先利用 cvt 计算一个新的 modeline $ cvt 1440 900 输出为: # 1440x900 59.89 Hz (CVT 1.30MA ...
- Java语言速览:StackOverflow
关于 java Java(请不要与 JavaScript 搞混)是一种设计为与 Java 虚拟机 (JVM) 一起使用的多用途编程语言.一般将安装了相关工具可以开发并运行 Java 程序的电脑系统称为 ...