当大量代码堆积在一个程序中,,我想很多人和我一样感到无能为力和吃力,,这时候如果有一个好的思路让我们的开发变的容易呢?
那就学习设计模式吧!一起学习吧,,从头开始!自己写博客也是对学习的领悟和笔记!
我们需要开发一个模拟鸭子的游戏,游戏中有各种鸭子,可以玩水可以叫。
你的想法我不知道 我的想法就是设计一个鸭子的父类 各种鸭子继承它扩展它
如果让鸭子飞?
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();
}
}