现在的位置: 首页 > 综合 > 正文

设计模式——策略模式

2014年10月17日 ⁄ 综合 ⁄ 共 2699字 ⁄ 字号 评论关闭

参考:http://blog.csdn.net/gnuhpc/article/details/5360328#

策略模式定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让方法的变化独立于使用方法的Client,适用于继承后的动作发生变化,要动态的改变对象的行为时。

核心思想:将is-a 转换为has-a.

基本的思路:将一些原先要继承的方法,以接口的方式抽象出来,然后再以实现该接口的方式定义一些类以完成实际能力的实现;同时在基类中以组合的方式将该接口的实例放入基类,基类同时提供设置这个实例的接口以及这个方法的封装,子类继承基类是对这些接口实例进行设置即可。

设计原则1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起,把会变化的部分取出并封装起来,好让其他部分不会受到影响

设计原则2:针对接口编程,而不是针对实现编程。

针对实现编程 针对接口编程 更好的针对接口编程
Dog d=new Dog(); 
d.dark();
Animal animal=new Dog(); 
animal.makesound();
a = getAnimal(); 
a.makeSound();
不得不针对具体实现coding 利用animal多态处理 运行时才指定具体实现的对象

设计原则3:多用组合,少用继承。这样可使系统更具有弹性。


类图:



鸭子的设计问题:




代码:

//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();  //这里也可以使用setFlyBehavior方法,下同!
     }  
     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();  
    }  
} 


抱歉!评论已关闭.