设计模式—策略模式

策略模式:定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

使用到的设计原则:

#1. 找出应用中可能需要变化之处,把它独立出来,不要和那些不需要变化的代码混在一起。

#2. 针对接口编程,而不是针对实现编程。

#3. 多用组合,少用继承。

举例:head first设计模式中的鸭子例子

代码:

Duck.java

package proj.wxh.duck;

/**

 * 鸭子基类

*/

public abstract class Duck {

         // 引用实现QuackBehavior接口的对象

         QuackBehavior quackBehavior;

         // 同上

         FlyBehavior flyBehavior;

         // 委托给quackBehavior引用的对象处理

         public void performQuack(){

                   quackBehavior.quack();

         }

         // 同上

         public void performFly(){

                   flyBehavior.fly();

         }

         // 添加动态设定行为,随时改变动物行为

         public void setQuackBehavior(QuackBehavior quackBehavior) {

                   this.quackBehavior = quackBehavior;

         }

         public void setFlyBehavior(FlyBehavior flyBehavior) {

                   this.flyBehavior = flyBehavior;

         }

        

         public void swim(){

                   System.out.println("All Ducks Float, Even Decoys");

         }

}

 

FlyBehavior.java

package proj.wxh.duck;

 

public interface FlyBehavior {

         /**

          * 飞行行为

         */

         public void fly();

}

 

FlyNoWay.java

package proj.wxh.duck;

 

public class FlyNoWay implements FlyBehavior {

 

         @Override

         public void fly() {

                   System.out.println("鸭子不会飞");

         }

 

}

 

FlyWithWings.java

package proj.wxh.duck;

 

public class FlyWithWings implements FlyBehavior{

 

         @Override

         public void fly() {

                   System.out.println("鸭子飞行");

         }

}

 

QuackBehavior.java

package proj.wxh.duck;

 

public interface QuackBehavior {

         /**

          * 尖叫行为

         */

         public void quack();

}

 

Quack.java

package proj.wxh.duck;

 

public class Quack implements QuackBehavior {

 

         @Override

         public void quack() {

                   System.out.println("鸭子呱呱叫");

         }

 

}

 

Squeak.java

package proj.wxh.duck;

 

public class Squeak implements QuackBehavior {

 

         @Override

         public void quack() {

                   System.out.println("鸭子吱吱叫");

         }

 

}

 

MallardDuck.java

package proj.wxh.duck;

 

public class MallardDuck extends Duck {

         public MallardDuck() {

                   // 创建Quack类实例,委托给quack对象  quackBehavior由基类继承来的

                   quackBehavior=new Quack();

                   // 同上

                   flyBehavior=new FlyWithWings();

         }

        

         public void display(){

                   System.out.println("I am a real Mallard Duck");

         }

}

 

MallardDuck.java

package proj.wxh.duck;

 

public class MallardDuck extends Duck {

         public MallardDuck() {

                   // 创建Quack类实例,委托给quack对象  quackBehavior由基类继承来的

                   quackBehavior=new Quack();

                   // 同上

                   flyBehavior=new FlyWithWings();

         }

        

         public void display(){

                  System.out.println("I am a real Mallard Duck");

         }

}

 

参考自<<head first设计模式>>

猜你喜欢

转载自blog.csdn.net/u013468915/article/details/51811093