您的位置:首页 > 编程语言

设计模式(DesignPattern)之策略模式(Strategy)

2007-12-02 16:28 381 查看
Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides
OO原则是我们的目标,而设计模式是我们的做法。
把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用它们。
除非你很积极地让神经元活动起来,否则你的头脑里什么也不会发生。
学得更快、更深入,集中注意力,怎样思考的?学习方法?


Dog d = new Dog();


d.bark();




Animal animal = new Dog();


annimal.bark();




a = getAnimal();


a.makeSound();






public class Duck ...{


    QuackBehavior quackBehavior;


    //还有更多




    public void performQuack() ...{


        quackBehavior.quack();


    }


}






public class MallardDuck extends Duck ...{




    public MallardDuck() ...{


        quackBehavior = new Quack();


        flyBehavior = new FlyWithWings();


    }




    public display() ...{


        System.out.println("I'm a real Mallard duck");


    }


}






public abstract class Duck ...{


    FlyBehavior flyBehavior;


    QuackBehavior quackbehavior;




    public Duck() ...{


    }




    public abstract void display();


    




    public void peformFly() ...{


        flyBehavior.fly();


    }




    public void peformQuack() ...{


        quackBehavior.quack();


    }




    public void swim() ...{


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


    }


}






public interface FlyBehavior ...{


    public void fly();


}






public class FlyWithWings implements FlyBehavior ...{




    public void fly() ...{


        System.out.println("I'm flying!");


    }


}






public class FlyNoWay implements FlyBehavior ...{




    public void fly() ...{


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


    }


}






public interface QuackBehavior ...{


    public void quack();


}






public class Quack implements QuackBehavior ...{




    public void quack() ...{


        System.out.println("Quack");


    }


}






public class MuteQuack implements QuackBehavior ...{




    public void quack() ...{


        System.out.println("Squeak");


    }


}




-->




public class MiniDuckSimulator ...{




    public static void main(String[] args) ...{


        Duck mallard = new MallardDuck();


        mallard.performQuack();


        mallard.performFly();


    }


}


==>


Quack


I'm flying!




#动态设定行为




public void setFlyBehavior(FlyBehavior fb) ...{


    flyBehavior = fb;


}




public void setQuackBehavior(QuackBehavior qb) ...{


    quackBehavior = qb;


}






public class ModelDuck extends Duck ...{




    public ModelDuck() ...{


        flyBehavior = new FlyNoWay();


        quackBehavior = new Quack();


    }




    public void display() ...{


        System.out.println("I'm a model duck");


    }


}






public class FlyRocketPowered implements FlyBehavior ...{




    public void fly() ...{


        System.out.println("I'm flying with a rocket!");


    }


}






public class MiniDuckSimulator ...{




    public static void main(String[] args) ...{


        Duck mallard = new MallardDuck();


        mallard.performQuack();


        mallard.performFly();




        Duck model = new ModelDuck();


        model.performFly();


        model.setFlyBehavior(new FlyRocketPowered());


        model.performFly();


    }


}


==>


Quack


I'm flying!


I can't fly


I'm flying with a rocket!

时刻思考着:模式如何依赖基础与原则

OO原则:

1.找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
把会变化的部分取出并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分。
2.针对接口编程,而不是针对实现编程。
3.多用组合,少用继承。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息