什么是策略模式:它定义了一系列算法,可以根据不同的实现调用不同的算法

大多数的设计模式都是为了解决系统中变化部分的问题

一、OO基础

抽象、封装、多态、继承

二、OO原则

1.封装变化,如把FlyBehavious、QuackBehavior从Duck中抽离出来

2.组合优于继承

3.面向抽象(接口、抽象类)编程而不是面向实现

4.为对象的解耦设计而努力

5.类应该对扩展开放,对修改封闭

6.依赖抽象,不要依赖具体

7.Principle of Least Knowledge -talk only to your immediate friends.

8.A class should have only one reason to change.

三、设计过程

1.不合理地用继承

2.需求变化,要增加飞行

3.继承的弊端出现,不需要的也会被继承

4.用接口也不合适

5.封装变化部分

6.策略模式,使不同的子类可以重用行为,且可以随时添加新行为而不影响现有代码

7.

四、代码实现

1.

 package headfirst.designpatterns.strategy;

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

2.

package headfirst.designpatterns.strategy;

public interface FlyBehavior {
public void fly();
}

3.

package headfirst.designpatterns.strategy;

public interface QuackBehavior {
public void quack();
}

4.

 package headfirst.designpatterns.strategy;

 public class MallardDuck extends Duck {

     public MallardDuck() {

         quackBehavior = new Quack();
flyBehavior = new FlyWithWings(); } public void display() {
System.out.println("I'm a real Mallard duck");
}
}

5.

package headfirst.designpatterns.strategy;

public class RedHeadDuck extends Duck {

    public RedHeadDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
} public void display() {
System.out.println("I'm a real Red Headed duck");
}
}

6.

package headfirst.designpatterns.strategy;

public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying!!");
}
}

7.

 package headfirst.designpatterns.strategy;

 public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("I'm flying with a rocket");
}
}

8.

package headfirst.designpatterns.strategy;

public class Quack implements QuackBehavior {
public void quack() {
System.out.println("Quack");
}
}

9.

 package headfirst.designpatterns.strategy;

 public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("Squeak");
}
}

10.

 package headfirst.designpatterns.strategy;

 public class MiniDuckSimulator {

     public static void main(String[] args) {

         MallardDuck    mallard = new MallardDuck();
RubberDuck rubberDuckie = new RubberDuck();
DecoyDuck decoy = new DecoyDuck(); Duck model = new ModelDuck(); mallard.performQuack();
rubberDuckie.performQuack();
decoy.performQuack(); model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}

11.

 package headfirst.designpatterns.strategy;

 public class MiniDuckSimulator1 {

     public static void main(String[] args) {

         Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly(); Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly(); }
}

五.练习:在游戏中如何给不同角色赋予不同的武器

HeadFirst设计模式之策略模式的更多相关文章

  1. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  2. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  3. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

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

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

  5. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

  6. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  7. [design-patterns]设计模式之一策略模式

    设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...

  8. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

  9. 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...

随机推荐

  1. Ajax和JSON基础

    Ajax (核心是XMLHttpRequest对象) 1.XMLHttpRequest对象: request=new XMLHttpRequest()  支持Firefox opera Safari  ...

  2. DataX的简单编译安装测试

    搭建环境:     Java > =1.6     Python>=2.6 <3     Ant     Rpmbuild     G++     编译DataX: 进入rpm文件夹 ...

  3. 通过命令行连接oracle数据库/进入sql plus

    1.直接打开SQL Plus登录,需要用户名和密码 开始->程序->Oracle->应用程序开发->sqlplus 我的电脑是“开始”->“Oracle - OraDb1 ...

  4. 找个输入IPoint在某个FeatureClass上距离最近的要素

      /// <summary> /// 得到输入点在输入图层上的最近点 /// </summary> /// <param name="randomPoints ...

  5. int组成时间值

    int startYear = int.Parse(DateTime.Now.Year.ToString()); int startMouth = int.Parse(DateTime.Now.Mon ...

  6. Shared library can't open object

    将cpp的源文件和.so (shared object)链接成可执行程序之后,无法运行,提示如标题,实际就是找不到共享库. 最终找到了解决办法是: export LD_LIBRARY=./:$LD_L ...

  7. mysql---用户管理

    #创建用户king , 登陆密码为1234 create user 'king' identified by '1234'; #查看创建用户的语句,即上面那条创建用户的语句 show grants f ...

  8. JSON Helper

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Se ...

  9. input获取永久焦点

    $(function () { $('#test').blur(function () { var that = this; //或者用闭包 setTimeout(function () { $(th ...

  10. gulp 不是内部或者外部命令 或者 webpack 不是内部或者外部命令

    gulp安装也正常,但是就是查看gulp -v的时候报错,原因:缺少系统变量PATH或者PATH变量错误 提示:这个系统变量PATH,直接追加就好(多个变量值用分号;隔开),不要删除已经有的系统变量P ...