您的位置:首页 > 其它

在手机应用领域为何有那么多失败的开发者?

2012-07-12 11:44 309 查看
HeadFirst设计模式学习笔记((JAVA版)鸭子与策略(Strategy)模式

原文转自:http://www.cnblogs.com/nokiaguy/archive/2009/02/11/1388168.html

策略模式的设计原则如下:

1. 将应用中需要经常变化的代码独立出来,应和那些不需要经常变化的代码分开。

2. 应针对接口,而不是类进行编程。

3. 在类中应多用组合,少用继承。

例子:

我们要实现一个鸭子模拟器,这个鸭子模拟器由Duck类描述,而Duck类有如下4个行为:

1. display

2. swim

3. fly(飞)

4. quack(叫)

其中swim是所有鸭子都具有的特性,而且所有鸭子的这些特性都相同,因此,这个方法可以直接在Duck类中实现。display方法也是所有鸭子具有的特性,但随着鸭子的种类不同,display也有所不同,因此,display方法应为Duck类的抽象方法。fly和quack并不是所有鸭子的特性,如橡皮鸭子即不会飞,也不会叫。因此,可以将这两个方法看作是两个行为,可将每一个行为设计成一个接口。这样可以和Duck类完全脱离。因为,fly和quack与Duck一点关系都没有(别的东西也可能fly和quack),然后不同的fly和quack分别用实现相应接口的类表示。

下面是关于Duck的完整代码:

fly行为
//  飞行接口
public interface FlyBehavior {
public void fly();
}
//  飞
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("正在用翅膀飞行");
}
}
//  不飞
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("不会飞");
}
}
//坐火箭飞
public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("坐火箭飞");
}
}


quack行为
//  叫接口
public interface QuackBehavior {
public void quack();
}
// 嘎嘎叫
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("嘎嘎叫");
}
}
//  吱吱叫
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("吱吱叫");
}
}
//  不叫
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("不会叫");
}
}


实现Duck类
//  鸭子超类
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("正在游泳~~");
}
}


建立不同的鸭子类

//  野鸭
public class MallardDuck extends Duck {

public MallardDuck() {

quackBehavior = new Quack();
flyBehavior = new FlyWithWings();

}

public void display() {
System.out.println("绿头鸭");
}
}
//  红头鸭
public class RedHeadDuck extends Duck {

public RedHeadDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}

public void display() {
System.out.println("红头鸭");
}
}
//  橡皮鸭
public class RubberDuck extends Duck {

public RubberDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}

public void display() {
System.out.println("橡皮鸭");
}
}
//模型鸭
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}

public void display() {
System.out.println("模型鸭");
}
}




调用代码如下:
public class MiniDuckSimulator {

public static void main(String[] args) {

MallardDuck	mallard = new MallardDuck();
RubberDuck	rubberDuckie = new RubberDuck();
RedHeadDuck	redHeadDuck = new RedHeadDuck();

ModelDuck	model = new ModelDuck();

mallard.performQuack();
rubberDuckie.performQuack();
redHeadDuck.performQuack();

model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: