需求描述:
- 鸭子类(duck)
- 多个品种的鸭子(红头鸭,绿毛鸭,玩具鸭)
- 多种行为动作(呱呱叫,飞翔,外观展示)
如何设计呢?
普通的设计模式:
- duck为父类,定义了呱呱叫 飞翔 外观展示等方法
public class Duck { public String guagua(){ //呱呱叫 } public String fly(){ //飞翔 } public String display(){ //外观展示 }}复制代码
- 多个品种的鸭子 设计为子类 继承 duck
public class RedHeadDuck extend Duck{ //覆写父类的外观方法 public String display(){ //我是红头鸭 }}复制代码
这么设计问题出现了,所有的鸭子都具有了飞翔和呱呱叫的能力,但是玩具鸭并不具有飞翔的能力
修改设计:
- duck仍为父类
public class Duck { public String guagua(){ //呱呱叫 } public String display(){ //外观展示 }}复制代码
- 设计接口 flyBehavior
public interface FlyBehavior { Stirng fly();}public class FlyDuck extend Duck implements FlyBehavior { public String fly(){ //我会飞翔 }}public class ToyDuck extend Duck { public String display() { //我是一个玩具鸭 }}复制代码
将需要实现飞翔的子类实现接口flyBehavior这样只需要玩具鸭不去实现接口就解决了飞翔的问题
但是 问题来了 如果说飞翔又分为 借力飞翔 迎风飞翔 等不同的飞翔方式
实现接口的子类需要 不同的实现方式,代码更多 而且不能够复用升级设计
- duck为父类
- 设计接口 flyBehavior
- 设计行为类 实现 flyBehavior
- duck 中引用 行为类
public class Duck { private FlyBehavior flyBehavior; public setFlyBehavior(FlyBehavior f){ this.flyBehavior = f; } public String fly(){ return flyBehavior.fly(); }}public class NoFly implements FlyBehavior { public String fly () { //不能飞翔 }}public class CanFly implements FlyBehavior { public String fly () { //可以飞翔 }}//还可以定义多种飞翔方式。。。。复制代码
这样设计就可以很灵活的修改类
结语:策略模式(strategy pattern)
将行为类 即易改变的东西抽取出来多用组合 少用继承针对接口编程 不要针对实现编程文章参考《head first 设计模式》未经作者允许 请勿转载,谢谢 :)