1、什么是策略模式?
策略模式将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。也就是说将不变的部分抽象出来,定义算法族分别封装起来,客户端不会受算法改变的影响,对新增需求的弹性需求。
2、复合(组合):在类中增加一个私有的域,引用另一个已有的类的实例,通过调用实例的方法从而获得新的功能,这种设计被称为组合。例如:汽车的一个组合是车轮,Car类通过一个私有的域tires,这个域中有Tire<Array>数组,通过它引用Tire类中的实例。从而使用该类中的方法。比如说,A轮胎具有很强的抓地力适合雨雪天行驶,B轮胎适合晴朗天行驶,那么我们只需通过根换轮胎不同的实例就可以啦。
3、策略模式中的设计原则
1、找出应用中需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混在一起。将不变的东西抽象成接口,变化的部分交给实现去做。2、面向接口编程,而不是面向实现编程。接口为我们提供契约。3、多用组合少用继承。
4、策略模式的实现
1、通过分离变化得出的策略接口Strategy
/*策略接口,实现鸭子的飞行行为*/ public interface FlyingStargety{ void performFly();} 2、Strategy实现类
public class FlyNoWay implements FlyingStragety{ @Override public void performFly() { // TODO Auto-generated method stub System.out.println("我不会飞行"); }} 3、客户端程序”有一个“Strategy。(鸭子类持有一个飞行策略,通过飞行策略执行飞行行为)
private FlyingStragety flyingStragety; public void setFlyingStragety(FlyingStragety flyingStragety) { this.flyingStragety = flyingStragety; } public void fly(){ flyingStragety.performFly(); } 4、在客户程序中选择、组装正确的Strategy实现类(使得不同种类的鸭子具有相应的飞行行为)
public RedHeadDuck(){ super(); super.setFlyingStragety(new FlyWithWin()); }package com.imooc.pattern.strategy; public class BigYellow extends Duck{ public BigYellow(){ super(); super.setFlyingStragety(new FlyNoWay()); } @Override public void display() { System.out.println("我身体恒大,全身黄黄"); } } package com.imooc.pattern.strategy;/* * 超类,所有的鸭子都要继承此类 * 抽象了鸭子的行为:显示和鸣叫 */public abstract class Duck { /* * 鸭子发出叫声 * 通过行为,由父类实现 */ public void quack(){ System.out.println("叫声、、、嘎嘎嘎"); } /* * 显示鸭子的外观 * 鸭子的外观各不相同,声明为abstract,由子类实现 */ public abstract void display(); private FlyingStragety flyingStragety; public void setFlyingStragety(FlyingStragety flyingStragety) { this.flyingStragety = flyingStragety; } public void fly(){ flyingStragety.performFly(); } }package com.imooc.pattern.strategy;/* * 策略接口,实现鸭子的飞行行为 */public interface FlyingStragety { void performFly(); }package com.imooc.pattern.strategy; public class FlyNoWay implements FlyingStragety{ @Override public void performFly() { // TODO Auto-generated method stub System.out.println("我不会飞行"); }}package com.imooc.pattern.strategy; public class TestDuck { public static void main(String[] args) { System.out.println("测试鸭子程序"); System.out.println("**************"); Duck duck=null; //duck=new MallardDuck(); //duck=new RedHeadDuck(); //duck=new RubberDuck(); //duck=new BigYellow(); duck=new SpaceDuck(); duck.display(); duck.quack(); duck.fly(); System.out.println("***************"); System.out.println("测试完毕"); } } package com.imooc.pattern.strategy;/* * 太空鸭子 */public class SpaceDuck extends Duck{ public SpaceDuck(){ super(); super.setFlyingStragety(new FlyWithRocket()); } @Override public void display() { // TODO Auto-generated method stub System.out.println("太空鸭子的头顶有防护罩"); } @Override public void quack() { // TODO Auto-generated method stub System.out.println("通过无线电与我们通信"); } } package com.imooc.pattern.strategy; public class FlyWithRocket implements FlyingStragety{ @Override public void performFly() { // TODO Auto-generated method stub System.out.println("用火箭飞行"); } }