这是一只鸭子类的设计图,其中所有鸭子都会SWIN()和Display();但并不都会fly和quack,下图设计就是把fly和quack两中行为变为接口。
这中模式的不足之处在那?
1, 重复的代码会变多,如果子类很多,那么每个子类都要修改下fly这个方法。
2, 代码的复用性很差。
3, 如果此时代码的quack()的实现需要修改下,以前的“呱呱叫”现在要修改成“呱呱呱呱叫”那么的还需要找到所有实现“呱呱叫”的类去修改,这样就很容易造成新的错误。
修改以上方法思路:
把会变化的的部分取出并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分。
1.同样定义接口fly和quack只是将fly和quack实现各自的动作行为类。如:会飞的类,不会飞的类。这样就将fly和quack从鸭子里分开了。
2.看下代码的实现
这里FlyImpl和QuackImpl分别是飞行和叫的借口,而flynoway和Flywithwings是flyImpl的具体实现类,分别是会飞和不会飞类。同样quack和quackMute也是quack接口的具体实现类分别表示会叫和不会叫的。
看下duck类的代码:
Duck类中加入2个实例变量,分别为flyImpl和quackImpl声明为借口类型。每个鸭子都会动态地设置这些变量以在运行时引用准确的行为类型。
看下蓝鸭子的具体实现类:
蓝鸭子在构造器中就声明了自己的行为 表示会飞和不会叫。
运行代码: