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的更多相关文章

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

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

  2. 深入浅出设计模式——策略模式(Strategy Pattern)

    模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务.在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可 ...

  3. [转]设计模式(22)-Strategy Pattern

    一. 策略(Strategy)模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 假 设现 ...

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

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

  5. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  6. 第 1 章 策略模式【Strategy Pattern】

    第 1 章 策略模式[Strategy Pattern] 以下内容出自: 24种设计模式介绍与6大设计原则.pdf 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手 ...

  7. [Design Pattern] Service Locator Pattern 简单案例

    Service Locator Pattern,即服务定位模式,用于定位不同的服务.考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务. 代码 ...

  8. [Design Pattern] Front Controller Pattern 简单案例

    Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...

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

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

随机推荐

  1. python3之time、datetime、random

    UTC:协调世界时,又称世界统一时间.世界标准时间.国际协调时间.由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC. 中国属于东八区,领先世界时间8小时 time模块 time.ti ...

  2. 三台linux集群hadoop,在此上面运行hive

    ---恢复内容开始--- 一,准备 先有三台linux,对hadoop集群的搭建. eddy01:开启一个hdfs的老大namenode,yarn的老大ResourceManager其中进程包括(No ...

  3. 某大型跨境电商JVM调优总结

    前提:某大型跨境电商业务发展非常快,线上机器扩容也很频繁,但是对于线上机器的运行情况,特别是jvm内存的情况,一直没有一个统一的标准来给到各个应用服务的owner.经过618大促之后,和运维的同学讨论 ...

  4. C++获取当前执行程序文件所在的全路径

  5. Selenium IDE录制脚本时弹出窗口的完美处理

    很多朋友录制脚本时新打开弹出窗口后无法定位元素,我也遇到同样的问题,国内没有什么好的资料,于是就阅读英文,不断尝试,感觉那个selectWindow(title)什么就是个坑,我用这种方法成功处理后得 ...

  6. Android开发中常见的设计模式(三)——观察者模式

    先看下这个模式的定义. 定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新 先来讲几个情景. 情景1:有一种短信服务,比如天气预报服务,一旦你订阅 ...

  7. __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)

    自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room: def __init__(self,name): self.name = n ...

  8. LevelDB源码分析-TableBuilder生成sstable

    TableBuilder生成sstable(include/table_builder.h table/table_builder.cc) LevelDB使用TableBuilder来构建sstabl ...

  9. docker镜像加速器

    目前国内比较靠谱的镜像加速器网址:https://www.daocloud.io/mirror

  10. 【python深入】获取对象类型及属性

    在python中,查看当前的对象所能够调用的所有方法? 查看类型可以通过type,也可以通过isinstance方法,查看属性可以通过dir() 下面是对type的介绍: ————>基本类型的判 ...