HeadFirst Strategy策略模式

HeadFirst Strategy策略模式

思考方式:

把会变化的部分取出来并封装起来,不要和不需要变化的代码混在一起

 

        鸭子(抽象)不会变化,鸭子的行为是具体的鸭子所具有的,不同的鸭子有不同的Fly行为和Quack行为

--------------------------------------------------------------------------------------------------------------------------------

 package HeadFirst.Strategy;

public abstract class Duck {

 

     FlyBehavior flyBehavior;

     QuackBehavior quackBehavior;

     public Duck()

     {

    

     }

     public abstract void display();

    

     public void performFly()

     {

        flyBehavior.fly();

     }

     public void performQuack()

     {

        quackBehavior.quack();

     }

     public void swim()

     {

        System.out.println("All duck float,even decoys!");

     }

 

}

--------------------------------------------------------------------------------------------------------------------------------

 

package HeadFirst.Strategy;

 

public interface FlyBehavior {

    public void fly();

}

--------------------------------------------------------------------------------------------------------------------------------

 

 

 

package HeadFirst.Strategy;

 

public class FlyNoWay implements FlyBehavior {

 

    public void fly() {

// TODO Auto-generated method stub

System.out.println("I can't fly...");

    }

 

}

 

 

--------------------------------------------------------------------------------------------------------------------------------

package HeadFirst.Strategy;
public interface QuackBehavior {
    public void quack();
}

--------------------------------------------------------------------------------------------------------------------------------

package HeadFirst.Strategy;
public class Quack implements QuackBehavior {
    public void quack() {
// TODO Auto-generated method stub
System.out.println("Quacking...");
    }
}

--------------------------------------------------------------------------------------------------------------------------------

 

package HeadFirst.Strategy;
public class MuteQuack implements QuackBehavior {
    public void quack() {
// TODO Auto-generated method stub
System.out.println("I can't Quack...");
    }
}

--------------------------------------------------------------------------------------------------------------------------------

package HeadFirst.Strategy;
public class Squeak implements QuackBehavior {
    public void quack() {
// TODO Auto-generated method stub
System.out.println("I can squeak...");
    }
}

 

--------------------------------------------------------------------------------------------------------------------------------

package HeadFirst.Strategy;
public class MallardDuck extends Duck {
    public MallardDuck()
    {
quackBehavior=new Quack();
flyBehavior=new FlyWithWings();
    }
    public void display() {
// TODO Auto-generated method stub
System.out.println("I'm a real Mallard Duck...");
    }
}

--------------------------------------------------------------------------------------------------------------------------------

package HeadFirst.Strategy;
public class MiniDuckSimulator {
    public static void main(String[] args) {
Duck mallard=new MallardDuck();
mallard.performQuack();
mallard.performFly();
    }
}

--------------------------------------------------------------------------------------------------------------------------------

在Duck类中加入新方法
     public void setFlyBehavior(FlyBehavior fb)
     {
        flyBehavior=fb;
     }
     public void setQuackBehavior(QuackBehavior qb)
     {
        quackBehavior=qb;
     }

 

--------------------------------------------------------------------------------------------------------------------------------

新建一个新的鸭子类型
package HeadFirst.Strategy;
public class ModelDuck extends Duck {
    public ModelDuck()
    {
quackBehavior=new MuteQuack();
flyBehavior=new FlyNoWay();
    }
    public void display() {
// TODO Auto-generated method stub
System.out.println("I'm a Model Duck...");
    }
}

--------------------------------------------------------------------------------------------------------------------------------

新建一个Behavior类型
package HeadFirst.Strategy;
public class FlyRocketPowered implements FlyBehavior {
    public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying with rocket...");
    }
}

--------------------------------------------------------------------------------------------------------------------------------

新建一个QuackBehavior类型
package HeadFirst.Strategy;
public class QuackWithRing implements QuackBehavior {
    public void quack() {
// TODO Auto-generated method stub
System.out.println("I'm Quacking with Ring...");
    }
}

--------------------------------------------------------------------------------------------------------------------------------

重新测试;
package HeadFirst.Strategy;
public class MiniDuckSimulator {
    public static void main(String[] args) {
// TODO Auto-generated method stub
Duck mallard=new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model=new ModelDuck();
model.performFly();
model.performQuack();
model.setFlyBehavior(new FlyRocketPowered());
model.setQuackBehavior(new QuackWithRing());
model.performFly();
model.performQuack();
    }
}

--------------------------------------------------------------------------------------------------------------------------------

模式第一课
策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.
设计原则:多用组合,少用继承.
针对抽象接口编程.不针对实现编程.

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值