比如现在有一个模拟鸭子项目,它们有各自名字,会嘎嘎叫,游泳等。按照普通的面向对象写法
1. 定义一个超类 Duck
package strategyPattern.oo; public abstract class Duck { public Duck() { } public void Quack() { System.out.println("------ gagagaga -----------"); } public abstract void display(); public void swim() { System.out.println("------ im swim -----------"); } }
2. 定义一个类名叫绿头鸭 GeenHeadDuck
package strategyPattern.oo; public class GeenHeadDuck extends Duck { public void display() { System.out.println("------- im GreenHeadDuck -------------"); } }
3. 定义一个名叫红头鸭的类 RedHeadDuck
package strategyPattern.oo; public class RedHeadDuck extends Duck { public void display() { System.out.println("------------ im red Duck ----------------"); } }
4. 测试
此时根据结果可以看出, 绿头鸭会嘎嘎叫会游泳, 红头鸭也会嘎嘎叫会游泳。项目需求已现实。如此时提出需求说,鸭子还会飞,那么我们就又得在超类 Duck 加入方法fly
Duck 类
package strategyPattern.oo; public abstract class Duck { public Duck() { } public void Quack() { System.out.println("------ gagagaga -----------"); } public abstract void display(); public void swim() { System.out.println("------ im swim -----------"); } public void fly() { System.out.println("----------- im fly ------------"); } }
测试
此时新增需求完成, 那么此时,又说绿头鸭不会飞,我们又得改在绿头鸭的类
GeenHeadDuck
package strategyPattern.oo; public class GeenHeadDuck extends Duck { public void display() { System.out.println("------- im GreenHeadDuck -------------"); } public void fly() { System.out.println("----------- no fly ------------"); } }
测试
完成需求, 那么要是此时不止两次鸭子,要是有几百只鸭子,我们在超类增加一个行为方法,那么就会影响所有的子类,从而都需要去修改, 是不是就增加的工作量,耦合度也比较大。这时我们就可以考虑引入设计模式之中的策略模式。
那么我们应该怎么去设计策略模式呢
1. 分析项目中变化与不变化的部分,把变化的部分提取成接口与实现的方式
比如在这模拟鸭子项目中,叫声,和飞行就是变化部分,有点嘎嘎叫,有的咕咕叫,有点不会叫
有点飞得好,有的飞得差,还有的不会飞
2. 设计一个叫声的接口
package strategyPattern.pattern.service; public interface CryService { void Quack(); }
3. 设计一个飞行的接口
package strategyPattern.pattern.service; public interface FlyService { void fiy(); }
4. 不会叫的实现类
package strategyPattern.pattern.service.impl; import strategyPattern.pattern.service.CryService; public class NotCryServiceImpl implements CryService { public void Quack() { System.out.println("------- not quack -------------"); } }
5. gaga叫的实现类
package strategyPattern.pattern.service.impl; import strategyPattern.pattern.service.CryService; public class GaGaCryServiceImpl implements CryService { public void Quack() { System.out.println("--------------- gaga ----------------"); } }
6. gugu叫的实现类
package strategyPattern.pattern.service.impl; import strategyPattern.pattern.service.CryService; public class GuGuCryServiceImpl implements CryService { public void Quack() { System.out.println("---------- gugu -----------------"); } }
7. 不会飞的实现类
package strategyPattern.pattern.service.impl; import strategyPattern.pattern.service.FlyService; public class NotFylServiceImpl implements FlyService { public void fiy() { System.out.println("------ not fyl -----------"); } }
8. 飞的差的实现类
package strategyPattern.pattern.service.impl; import strategyPattern.pattern.service.FlyService; public class DiffFlyServiceimpl implements FlyService { public void fiy() { System.out.println("-------------- diff fly ----------------"); } }
9. 飞得好的实现类
package strategyPattern.pattern.service.impl; import strategyPattern.pattern.service.FlyService; public class GoodFlyServiceImpl implements FlyService { public void fiy() { System.out.println("-------- good fly -------------"); } }
10 超类
package strategyPattern.pattern; import strategyPattern.pattern.service.CryService; import strategyPattern.pattern.service.FlyService; public abstract class Duck { CryService cryService; FlyService flyService; public Duck() { } public void Quack() { cryService.Quack(); } public abstract void display(); public void fly() { flyService.fiy(); } /** 动态设置叫声 */ public void setCryService(CryService cryService) { this.cryService = cryService; } /** 动态设置飞行 */ public void setFlyService(FlyService flyService) { this.flyService = flyService; } }
11. 红头鸭设置咕咕叫,飞得好
package strategyPattern.pattern; import strategyPattern.pattern.Duck; import strategyPattern.pattern.service.impl.GoodFlyServiceImpl; import strategyPattern.pattern.service.impl.GuGuCryServiceImpl; public class RedHeadDuck extends Duck { public RedHeadDuck() { flyService = new GoodFlyServiceImpl(); cryService = new GuGuCryServiceImpl(); } public void display() { System.out.println("------------ im red Duck ----------------"); } }
12. 绿头鸭设置嘎嘎叫, 飞的差
package strategyPattern.pattern; import strategyPattern.pattern.Duck; import strategyPattern.pattern.service.impl.DiffFlyServiceimpl; import strategyPattern.pattern.service.impl.GaGaCryServiceImpl; public class GeenHeadDuck extends Duck { public GeenHeadDuck() { flyService = new DiffFlyServiceimpl(); cryService = new GaGaCryServiceImpl(); } public void display() { System.out.println("------- im GreenHeadDuck -------------"); } }
测试
完成, 若此时我想设置绿头鸭不会飞, 红头鸭飞的差,只需要调用超类设置方法就好
至此完成!