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();}}
- JAVA设计模式(1)
- java设计模式 (1)
- java设计模式(1)观察者模式
- java(1) 设计模式-单例设计模式
- Java设计模式-工厂模式(1)简单工厂模式
- java设计模式1
- Java设计模式(1)
- java 设计模式1
- java设计模式1
- java 设计模式--1
- JAVA设计模式:1
- 设计模式(java)
- Java(设计模式)
- 设计模式(java)
- 设计模式(java)
- Java设计模式1:设计模式概论
- 从Java类库看设计模式(1)
- java设计模式简介(1)
- 小公司工作一月小感
- Javascript解惑之 new A.B() 与 new A().B() 的区别
- 数据结构 概述
- (阶段三 dijkstra温习1.3)HDU 1874 畅通工程续(用dijkstra求单源起点和单点终点的最短路径(起点和终点动态给出))
- 博弈论入门
- JAVA设计模式(1)
- POJ 2152
- request.getSession(true)和request.getSession(false)的区别
- Linux之printf的缓冲区问题
- PHP 文件获取到数组 yahoo 音乐
- php,金字塔,乘法表
- Linux文件系统之文件的读写
- java 初始化与清理
- 程序员面试总结