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): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
随机推荐
- solr字段压缩属性compressed新版本已经移除
solr字段压缩属性compressed新版本已经移除 可能是考虑到压缩意义不大还减少搜索效率,所以去掉了.而且好像没有替代属性.
- 为 github markdown 文件生成目录(toc)
业务需要 在编写 github 项目时,有时候会编写各种 README.md 等 markdown 文件,但是 github 默认是没有目录的. 于是就自己写了一个小工具. markdown-toc ...
- 一致性hash算法及java实现
一致性hash算法是分布式中一个常用且好用的分片算法.或者数据库分库分表算法.现在的互联网服务架构中,为避免单点故障.提升处理效率.横向扩展等原因,分布式系统已经成为了居家旅行必备的部署模式,所以也产 ...
- canal 结合 kafka 入门
1.kafka的安装: 略 2.cannal 配置 使用卡夫卡: 修改 /home/admin/canal-server/conf/canal.properties 2.1 修改canal.ser ...
- <记录> Razor引擎&视图布局
标识符 @ Razor支持HTML和C#代码混编,意味着可以在HTML中随意输出变量 基本使用方法 直接@后面跟变量(当遇到 HTML标签 .空格.换行符等特殊符号时 便认为@之后到特殊符号前为变量名 ...
- jqueryValidate
参数详情可参见: http://www.runoob.com/jquery/jquery-plugin-validate.html 基本使用: /** 数据保存前校验 **/ $("#use ...
- SQL Server 中的6种事务隔离级别简单总结
本文出处:http://www.cnblogs.com/wy123/p/7218316.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- asmx 接收数据过大 发生错误
原文:https://www.cnblogs.com/xinaixia/p/5945316.html 错误:已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的 Max ...
- tensorflow报错error,tf.concat Expected int32, got list containing Tensors of type '_Message' instead
参考:https://stackoverflow.com/questions/41813665/tensorflow-slim-typeerror-expected-int32-got-list-co ...
- NYOJ737石子合并(二)-(区间dp)
题目描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出 ...