当大量代码堆积在一个程序中,,我想很多人和我一样感到无能为力和吃力,,这时候如果有一个好的思路让我们的开发变的容易呢?
那就学习设计模式吧!一起学习吧,,从头开始!自己写博客也是对学习的领悟和笔记!
我们需要开发一个模拟鸭子的游戏,游戏中有各种鸭子,可以玩水可以叫。
你的想法我不知道 我的想法就是设计一个鸭子的父类 各种鸭子继承它扩展它
如果让鸭子飞?
Duck这个基类的基础上加一个Fly方法吧,好么,,很多鸭子都不会飞呢,,修改基类的后果有多大,,显然影响的层面不仅仅是局部吧,,是全局。。有想到了,,不会飞,方法体是什么都没有不就好了,,会飞的有东西
会飞的 fly("各种方式飞”)
不会飞的 fly();
这样也不好,,写的太多了,,很麻烦对未来。。
换个想法使用接口啊!实现Flyable接口 看似很好,,每个能飞得都要实现啊,代码很多,,都不能重复使用了
我们要改变
设计原则:找出应用中可能需要变化之处,独立出来,不要和不变的混在一起啊 变化的可变,不变化的不变
如何分开 鸭子的一些固有的属性 是共同的当然是不变的,,变化的是什么是行为吧?
不同的鸭子有不同的行为 有的会飞 有的不会 有的会叫 有的不会(那是大黄鸭) 叫的方式也不同
咕咕叫 吱吱叫 还有不动的
解决:自己写一个行为类 把可变的放进去吧 飞行行为 叫行为 Duck还是超类
如何设计鸭子行为
我们希望一种方式是弹性的,鸭子的行为是动态可变的多好随是什么鸭子变化,,多态吧 运行时多态
设计原则 面对接口编程 不是实现编程
利用接口代表每个行为 FlyBehavior QuackBehavior 他们的实现右行为类实现不是Duck类
以前是有个基类 不同的接口让继承基类的派生类来实现 这个就是接口实现了
新设计中呢使用的是xxxBehaviour接口表示xxx行为实现没有绑定到具体的鸭子子类中。
针对接口编程实质是针对超类编程,利用多态我们可以根据不同的超类的类型,具体执行时会根据实际状况找到真正的行为,不会帮死到超类型上。 多态的解释
针对实现编程 dog x=new dog(); x.bark();
针对接口编程 Animal animal=new Dog(); animal.makesound();
不用关心是什么动物,正确发声就成了。
如何实现鸭子的行为
两个接口 FlyBehaviour QuackBehaviour
FlyWithWIngs 类 会飞的 实现方法
FlyNoWay类 不会飞的也实现 但是方法体什么都没有
整和鸭子的行为 Duck ;类中两个实例 FlyBehaviour QuackBehaviour 接口类型 其他都是不变的东西了
方法中有PerformQuack 和 PerformBehaviour 这两个方法 实际上是前面两个引用来操作了
对于不同的鸭子我们要做的很容就是调用的不同的实现FlyBehaviour方法
两种实现FlyWithWIngs FlyNoWay 选择不同的类即可就成。。。
下面给出一个实现就会明白
public interface FlyBehavior { public void fly(); }
public interface QuackBehavior { public void quack(); }
public class FlyNoWay implements FlyBehavior{ @Override public void fly() { // TODO Auto-generated method stub } }
public class FlyWithWings implements FlyBehavior { @Override public void fly() { // TODO Auto-generated method stub System.out.println("用翅膀飞吧"); } }
public class MuteQuack implements QuackBehavior{ @Override public void quack() { // TODO Auto-generated method stub } }
public class Quack implements QuackBehavior{ public void quack() { // TODO Auto-generated method stub System.out.println("呱呱叫"); } }
public abstract class Duck { FlyBehavior Fly; QuackBehavior Quack; public void performFly() { Fly.fly(); } public void performQuack() { Quack.quack(); } }
public class YellowDuck extends Duck{ public YellowDuck() { Fly=new FlyNoWay(); Quack=new MuteQuack(); } }
public class NormalDuck extends Duck { public NormalDuck() { Fly=new FlyWithWings(); Quack=new Quack(); } }