head first 设计模式总结(一)策略模式
来源:互联网 发布:淘宝零食店加盟 编辑:程序博客网 时间:2024/04/24 11:50
设计原则
(1) 封装变化
(2) 多用组合,少用继承
(3) 针对接口编程,不针对实现编程
定义
定义算法簇,分别封闭起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
举例
公司要设计一套模拟鸭子的游戏,游戏中会出现各种各样的鸭子,一边游泳戏水,一边呱呱叫,设计如下:
Duck是一个抽象类,由于每个鸭子的外观不同,所以display()方法为抽象方法,由子类来具体实现。
公司需要创新,在鸭子中加入飞行的方法,设计如下:
在超类中加入fly()方法后,就会导致所有的子类都具有fly()方法,就连那些不能飞的鸭子也不能免除,quack()方法也是如此,并不是所有的鸭子都是呱呱叫,橡皮鸭不是呱呱叫,是吱吱叫,还有些鸭子不会叫,也不会飞,如诱饵鸭(木头假鸭)。当出现这种鸭子时,我们唯一能做的就是在子类中覆盖这些方法,即要修改所有不会飞的鸭子重写fly()方法,而且后期如果加入其它的鸭子,就要考虑是否要重写fly()和quack()方法,这简直就是无穷无尽的恶梦,这种设计超类一但改变,就会牵连到所有的子类,无疑是不好的。
封装变化
这时我们想到设计原则中的第一条“封装变化”。将变化的地方独立出来,不要和那些不变化的代码混在一起,这样使得代码变化引起的后果变少,系统更具有弹性。在此设计中,变化的地方是fly()和quack()方法,因此我们把这两人个方法提出来,建立一组新的类来代表第个行为。
针对接口编程,不针对实现编程
定义两个接口,FlyBehavior和QuackBehavior
多用组合,少用继承
在Duck类中使用组合的方法,来调用FlyBehavior和QuackBehavior两人个接口的方法,但具体使用接口的哪个实现类,由子类来确定
我们要想让设计更具有弹性,就应该可以动态的指定它们的行为,即在鸭子类中加入设定行为的方法
具体代码如下:
1、Duck
Public abstractclass Duck{
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck(){
}
Public abstract void display();
Public void swim(){
System.out.println(“swim”);
}
Public void setFlyBehavior(FlyBehavior fb){
This.flyBehavior = fb;
}
Public void setQuackBehavior(QuackBehavior qb){
This.quackBehavior = qb;
}
Public void performFly(){
flyBehavior.fly();
}
Public void performQuack(){
quackBehavior.fly();
}
}
2.FlyBehavior接口及其实现
Public interface FlyBehavior{
Public void fly();
}
Public class FlyWithWings implements FlyBehavior{
Public void fly(){
System.out.println(“flywith wings”);
}
}
Public class FlyNoWay implements FlyBehavior{
Public void fly(){
System.out.println(“flyno way”);
}
}
3.QuackBehavior接口及其实现
Public interface QuackBehavior{
Public void quack();
}
Public class Quack implementsQuackBehavior {
Public void quack (){
System.out.println(“quack”);
}
}
Public class MuteQuack implements QuackBehavior {
Public void quack (){
System.out.println(“MuteQuack”);
}
}
Public class Squeak implements QuackBehavior {
Public void quack (){
System.out.println(“Squeak”);
}
}
4.MallardDuck
Publicclass MallardDuck extends Duck{
PublicMallarDuck(){
quackBehavior= new Quack();
flyBehavior= new FlyWithWings;
}
Public voiddisplay(){
System.out.println(“mallard duck”);
}
}
最终设计如下:
- head first 设计模式总结(一)策略模式
- Head First 设计模式:(一)策略模式
- head first设计模式(一)——策略模式
- Head First 设计模式(一)策略模式
- 《Head First 设计模式》之策略(一)
- 观后总结:Head First设计模式(一)
- 《head first 设计模式》之策略模式
- head first 设计模式:策略模式
- 策略模式 - head first设计模式
- Head First 设计模式第一章 ----策略模式
- 《Head First设计模式》策略模式
- Head First设计模式-策略模式
- 【Head First设计模式】策略模式
- 《Head First 设计模式》策略模式
- 《Head First设计模式》之策略模式
- Head First 设计模式:1策略模式
- 《Head First 设计模式》之策略模式
- <Head First 设计模式>:策略模式--Duck
- TC SRM 554
- opencv 图像阴影检测
- 托盘程序导致无法注销或关机
- (七)数据的向导:指针
- OpenGL-光照模型
- head first 设计模式总结(一)策略模式
- CUDA程序开发
- OpenGL-绘制管线
- OpenGL-鼠标交互
- 错误 1 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 M
- OpenGL-显示列表
- 1484 Blowing Fuses
- MVC思想精髓
- 默认环境变量 PATH