设计原则:
1、找出应用中可能需要变化之处,把它独立出来,不要和那些不需变化的代码混在一起。
2、针对接口编程,而不是针对实现编程。(针对超类型编程)。
3、多用组合,少用继承。
示例程序(此处代码都为书上原码,只不过是本人手输入了一次)
大概讲下:
有套莫伊鸭子的游戏,SimUDuck,游戏中会出现许多鸭子,一边游泳,一边呱呱叫。
一开始,使用了标准的OO技术,设计了一个鸭子超类,并让各种鸭子继承此超类。
在此时,这种设计是对的,但是,如果老板说需要给鸭子增加个飞行的动作,那么此时该如何做呢?
我当时的做法和书中joe做法一样,把飞行动作放入父类,但这样,成了所有的鸭子都会飞,但明显不是所有鸭子都会飞,那么,又改为把飞行动作独立为一个接口,会飞的鸭子实现此接口,但这样同样很麻烦,每只会飞的鸭子都得实现飞行的方法。而且,飞行还有横飞,侧飞,倒飞,显而易见,(鸭子叫同样适合这种理论)这两种设计方法都不适合这里。
下面的代码:
package com.test;
鸭子超类:
public class Duck {
//此处为组合(把鸭子叫的接口作为类的一个属性)
private QuackBehavior quackBehavior;
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public Duck(){
quackBehavior = new Quack();
}
public void performQuack(){
quackBehavior.quack();
}
public static void main(String[] args) {
Duck duck = new Duck();
//动态设定鸭子叫的方式(可能嘎嘎,可能叽叽,也可能不会叫)
duck.setQuackBehavior(new Squeak());
duck.performQuack();
}
}
package com.test;
/**
* 飞行类的接口
* @author mah
*
*/
public interface FlyBehavior {
public void fly();
}
package com.test;
/**
* 鸭叫接口
* @author mah
*
*/
public interface QuackBehavior {
public void quack();
}
package com.test;
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("不会飞");
}
}
package com.test;
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("我飞~~~~");
}
}
package com.test;
//木头鸭子叫声
public class MuteQuack implements QuackBehavior{
@Override
public void quack() {
System.out.println("不会叫");
}
}
package com.test;
//鸭子叫声
public class Quack implements QuackBehavior{
@Override
public void quack() {
System.out.println("嘎嘎");
}
}
package com.test;
//皮鸭子叫声
public class Squeak implements QuackBehavior{
@Override
public void quack() {
System.out.println("叽叽");
}
}
策略模式抽取算法,并分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
OK,下一章,观察者模式
分享到:
相关推荐
Head First 策略模式 源码 设计模式
HeadFirst设计模式第一章的的策略模式的C++实现代码
head first 设计模式 策略模式 C++ 代码
用c++实现的headfirst策略设计模式。并附加对应的类图。
headfirst策略模式的代码 重要部分含一些注解
head first策略者模式学习笔记
《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes ...
NULL 博文链接:https://jacky-dai.iteye.com/blog/1132058
最近在看head first 设计模式,书上的例子是用java编写的.因为工作上C用的比较多,所以决定编看书,边用C++也编写书上的例子.既可以加深对设计模式的理解,也顺便练习下c++. 希望这写代码也能帮助别人学习c++和设计...
因为总共的太大,分成若干部分上传,增加了我根据书本缩编写的源代码,可在eclipse中导入。
http://blog.csdn.net/laszloyu/archive/2010/05/11/5579765.aspx 示例代码
headfirst策略模式的C++实现,请使用VS打开工程,或者使用记事本等直接查看里面代码,如有错误,欢迎指正。
Head First设计模式中介绍策略模式时以Duck类作为样例。当中用flyBehavior和quackBehavior两个接口引用变量代表鸭子飞行和鸭子叫这两种行为,通过改变flyBehavior和quackBehavior来满足不同的Duck子类的不同行为...
这是策略模式中的一个经典实例,通过鸭子问题,能让学习者更好的了解设计模式,这也是headfirst 设计模式中用的经典实例