Pattern Design - Strategy Pattern
If you can disassemble code and you want to apply one method of an object
in another object that there is no inheritance between them, you can use Strategy
Pattern. Aha, actually it is good strategy that we can wrap different kinds of algorithms,
then pass any of them to solve problem in different kinds of situation.
Now let's dive into it and show how it works!
1. Duck Class
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
* Duck.java
*/ 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;
}
}
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
* ModelDuck.java
*/
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay(); // Can not fly at first.
quackBehavior = new Quack();
}
public void display() {
System.out.println("I'm flying with a rocket.");
}
}
2.FlyBehavior Class
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
* FlyBehavior.java
*/ /**
* We declare a flying behavior interface so that
* we can implement different kinds of behaviors
* to ducks.
*/ public interface FlyBehavior {
public void fly();
}
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
* FlyNoWay.java
*/
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("I can't fly.");
}
}
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
*/ /**
* FlyWithWings
* FlyWithWings.java
*/ public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying");
}
}
3.QuackBehavior Class
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
* QuackBehavior.java
*/
public interface QuackBehavior {
public void quack();
}
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
* Quack.java
*/
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("Quack");
}
}
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
* MuteQuack.java
*/
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("<< Silence >>");
}
}
4. Test.
package Duck; /**
* Created by zhuangzebo on 2017/6/30.
* MultiDuckSimulator.java
*/
public class MultiDuckSimulator {
public static void main(String[] args) {
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyWithWings());
model.performFly(); model.performQuack();
model.setQuackBehavior(new MuteQuack());
model.performQuack();
}
}
I can't fly.
I'm flying
Quack
<< Silence >>
From the code above, We can know the apperance of strategy pattern. Here we can learn more for another example.
package processor; /**
* Created by zhuangzebo on 2017/6/30.
* Apply.java
*/ import java.util.*; class Processor {
public String name() {
return getClass().getSimpleName();
} Object process(Object input) {
return input;
}
} class Upcase extends Processor {
String process(Object input) {
return ((String)input).toUpperCase();
}
} class DownCase extends Processor {
String process(Object input) {
return ((String)input).toLowerCase();
}
} class Splitter extends Processor {
String process(Object input) {
return Arrays.toString(((String)input).split(" "));
}
} public class Apply {
public static void process(Processor p, Object s) {
System.out.println("Using Processor " + p.name());
System.out.println(p.process(s));
} public static String s = "Disagreement with beliefs is by definition incorrect.";
public static void main(String[] args) {
process(new Upcase(), s);
process(new DownCase(), s);
process(new Splitter(), s);
}
}
Pattern Design - Strategy Pattern的更多相关文章
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 深入浅出设计模式——策略模式(Strategy Pattern)
模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务.在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可 ...
- [转]设计模式(22)-Strategy Pattern
一. 策略(Strategy)模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 假 设现 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- 第 1 章 策略模式【Strategy Pattern】
第 1 章 策略模式[Strategy Pattern] 以下内容出自: 24种设计模式介绍与6大设计原则.pdf 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手 ...
- [Design Pattern] Service Locator Pattern 简单案例
Service Locator Pattern,即服务定位模式,用于定位不同的服务.考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务. 代码 ...
- [Design Pattern] Front Controller Pattern 简单案例
Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
随机推荐
- day44前端开发1之html基础
web前端开发1一.前端三剑客之html 1.为标记语言,是非编程语言 2.自身不具备逻辑,遇到负责重复操作只能全部手写(Ctrl+C > V) 3.组成:标签, 指令, 实体 标签:由< ...
- Python第1天
今天主要学习内容如下: 概论,各种开发语言的对比,高级语言包括:python(开发效率高,执行效率低) Java(开发效率低,执行效率高),PHP,低级语言包括:C语言,汇编语言: Python 语言 ...
- netbeans 正则替换
单引号替换为双引号: tablename1('xhw_aa') tablename2('xhw_bb') tablename3('xhw_cc') tablename4('xhw_dd') (t ...
- 最适合入门的Laravel中级教程(一)
Laravel 是一个全栈框架: 我们使用 Laravel 开发业务常见有 3 个方向: 前端页面和后端逻辑混合的应用 主要是面向对 SEO 有需求的项目: 比如说新闻资讯博客文章等: 一般在控制器中 ...
- CSS 盒子投影
box-shadow 属性可以设置盒子的投影效果.它的原理同文本投影一样.字体风格一节有介绍. 它有4个值,同时使用,也可以有选择地使用: 第一个值 设置阴影左右延伸长度,负值向左,正值向右 第二个值 ...
- centos 7 一键安装gitlab
# cat /etc/redhat-release CentOS release 6.5 (Final) # strings /lib64/libc.so.6 |grep GLIBC_ 首先升级 如果 ...
- 框架和内嵌框架--->frameset 和 iframe 的文档对象
框架和内嵌框架分别用 HTMLFrameElemnt 和 HTMLIFrameElement 表示,它们在 DOM2 中有一个新属性----->contentDocument,是一个指针,表示框 ...
- RESTful API格式 图片验证码接口
之前公司写图片验证码时用的是session 后来写接口时也想用session存验证码 不过领导说RESTful API 写接口 没有session这一说 于是就用了redis 存验证码 还有就是接口 ...
- NodeJs第3方包说明
formidable 作用:实现简单文件上传 var formidable = require('formidable'); var form = new formidable.IncomingFor ...
- Python的基本用法
---恢复内容开始--- 一.函数 1.1 默认参数 想要计算一个数x的n次方,可以定义如下的函数.但是有时候我们仅仅只需要计算x^2,所以只想使用一个参数即power(x),这时如果仍用如下代码会报 ...