HeadFirst设计模式之策略模式
什么是策略模式:它定义了一系列算法,可以根据不同的实现调用不同的算法
大多数的设计模式都是为了解决系统中变化部分的问题
一、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设计模式之策略模式的更多相关文章
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
- PHP设计模式之策略模式
前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...
- JavaScript设计模式之策略模式(学习笔记)
在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- JavaScript设计模式之策略模式
所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...
- 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查
原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...
- [design-patterns]设计模式之一策略模式
设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...
- 设计模式入门,策略模式,c++代码实现
// test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...
- 设计模式之策略模式和状态模式(strategy pattern & state pattern)
本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...
随机推荐
- java内部类的定义原则
/*内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必 ...
- 查看mysql集群状态是否正常
如何查看mysql集群状态是否正常: 进入mysql 输入show status like 'wsrep%': 查看cluster sizes 是否为3
- C++通过域名获取IP地址的方法;调试通过!
BOOL GetIpByDomainName(][],int *nCount) { WSADATA wsaData; ]; HOSTENT *pHostEnt; ; struct sockaddr_i ...
- Linux设备总线
kobject和kset是Linux设备模型中最基本的元素,其中,kset是同种类型kobject对象的集合.每个在内核中注册的kobject对象都对于sysfs文件系统中的一个目录.下面是自己花的一 ...
- 基于FPGA的按键扫描程序
最近在学习FPGA,就试着写了个按键扫描的程序.虽说有过基于单片机的按键扫描处理经验,对于按键的处理还是有一些概念.但是单片机程序的编写通常都采用C写,也有用汇编,而FPGA却是采用VHDL或者Ver ...
- 《SELinux安全上下文的管理(含图)》RedHat6.3——步骤详细、条理清晰
1.为什么浏览器只识别/var/www/html下的文件? 2.为什么不识别别的目录下的index.html文件呢? 3.这里牵扯到身份证,先安装软件包. 4.打开selinux 5.建立一个新的目录 ...
- apache重写字段详细说明
用Apache虚拟主机的朋友很多,apache提供的.htaccess模块可以为每个虚拟主机设定rewrite规则,这对网站SEO优化相当有用,同时也改善了用户体验.国内的虚拟机一般不提供.htacc ...
- margin折叠
什么是margin折叠:当两个或更多个垂直边距相遇时,它们将形成一个外边距.这个外边距的高度等于两个发生叠加的外边距的高度中的较大者. 注意: (1 ...
- 正则应用—queryURLParameter()
在项目中,我们做详情页的时候,需要获取到用户从哪里来点击进来,获取到用户的点击地址,根据不同的地址传进的参数向服务器获取不同的数据,然后加载不同的详情页面. 大部分企业都采用字符串截取的方式,quer ...
- size()函数的使用
matlab中对于矩阵的计算是十分方便的,其中关于矩阵的函数有很多 size() 在c/c++中sizeof用来求某变量所占用的字节数,在matlab中size()则可以用来求矩阵的“长度”,矩阵的长 ...