JAVA设计模式(1)

来源:互联网 发布:语音导航软件下载 编辑:程序博客网 时间:2024/04/30 12:36

当大量代码堆积在一个程序中,,我想很多人和我一样感到无能为力和吃力,,这时候如果有一个好的思路让我们的开发变的容易呢?

那就学习设计模式吧!一起学习吧,,从头开始!自己写博客也是对学习的领悟和笔记!


我们需要开发一个模拟鸭子的游戏,游戏中有各种鸭子,可以玩水可以叫。


你的想法我不知道 我的想法就是设计一个鸭子的父类  各种鸭子继承它扩展它


如果让鸭子飞?


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{@Overridepublic void fly() {// TODO Auto-generated method stub}}

public class FlyWithWings implements FlyBehavior {@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("用翅膀飞吧");}}

public class MuteQuack implements QuackBehavior{@Overridepublic void quack() {// TODO Auto-generated method stub}}

public class Quack implements QuackBehavior{public void quack() {// TODO Auto-generated method stubSystem.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();}}








原创粉丝点击