java设计模式学习之策略模式
来源:互联网 发布:软件宏编辑器 编辑:程序博客网 时间:2024/05/19 18:14
设计原则:
1.找出应用中可能需要变化之处,把他们独立出来,并封装起来,以便以后可以轻易的改动或者扩充此部分,不要和那些不需要变化的代码混在一起。代码变化引起的不经意后果变少,系统变得更有弹性。
2.针对接口编程,而不是针对实现编程。针对接口编程的意思是针对超类型编程(多态),变量的生命类型应该是超类型,通常是一个抽象类或者一个接口,只要是具体实现这个超类的类型所产生的对象,都可以指定给这个变量。 如下:
抽象类animal,两个具体的实现Dog和Cat继承Animal
1.针对实现编程:
Dog d = new Dog();
d.bark()
2.针对接口(超类型编程):
Animal animal = new Dog();
animal.makeSound(); //利用animal进行多态调用
3.多用组合,少用继承。当将两个类合并起来用的时候就是组合,和继承不一样的就是子类的行为不会继承来的,而是和适当的行为对象组合而来的。使用组合可以具有很强的弹性
1.FlyBehavior 和两个行为实现类
package strategy;/** * 所有飞行行为类必须实现的接口 */public interface FlyBehavior { public void fly();}
package strategy;/** * 飞行行为的实现,给真的会飞的样子使用 */public class FlyWithWings implements FlyBehavior{ @Override public void fly() { System.out.println("I am flying!"); }}
package strategy;/** * 给不会飞的鸭子用 */public class FluNoWay implements FlyBehavior{ @Override public void fly() { System.out.println("I can't fly"); }}
2.接口QuackBehavior 和三个叫的行为实现类
package strategy;public interface QuackBehavior { public void quack();}package strategy;public class Quack implements QuackBehavior { @Override public void quack() { System.out.println("Quack"); }}package strategy;public class Quack implements QuackBehavior { @Override public void quack() { System.out.println("Quack"); }}package strategy;public class Squeak implements QuackBehavior { @Override public void quack() { System.out.println("Squeak"); }}
3.Duck超类和其的一个子类
package strategy;public abstract class Duck { //为行为接口类型申明两个引用变量,所有鸭子子类都继承他们 FlyBehavior flyBehavior; QuackBehavior quackBehavior; public abstract void display(); public void performFly() { flyBehavior.fly();//委托给行为类 } public void performQuack() { quackBehavior.quack();//委托给行为类 } public void swim() { System.out.println("All duck swim"); }}package strategy;public class MallarDuck extends Duck{ //该类继承Duck类,所以用quackBehavior、flyBehavior两个变量 public MallarDuck() { quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } @Override public void display() { System.out.println("I am mallarDuck"); }}
4.测试类和运行结果
package strategy;public class MiniDuckSimulator { public static void main(String[] args) { Duck mallard = new MallarDuck(); mallard.performFly(); mallard.performQuack(); }}
I am flying!
Quack
动态的设定行为
在Duck类中加入setFlyBehavior和setQuackBehavior的方法,可以随时修改鸭子的行为
0 0
- java设计模式学习之策略模式
- java设计模式学习之策略模式
- java设计模式学习之策略模式
- java设计模式学习之策略模式
- java设计模式学习笔记之策略模式
- java设计模式学习之(一)策略模式
- Java设计模式之策略设计模式
- Java设计模式之策略设计模式
- Java设计模式之策略
- 学习设计模式之--------策略模式
- 设计模式之策略模式学习
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习之策略模式
- 设计模式学习之路-----策略模式
- 设计模式之策略模式学习
- 学习:设计模式之策略模式
- 设计模式学习之策略模式
- LeetCodeOJ_172_Factorial Trailing Zeroes
- Java构造方法注意事项
- 幽灵按钮css3
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记
- 程序中变量的存储
- java设计模式学习之策略模式
- 求二叉树的深度,判定二叉树是否是平衡二叉树(java)
- hdu 3449(依赖背包) Consumer
- JS算法*START寻找最短路径
- 面向对象方法的理解
- 一个简单的java登录小界面
- 【Android】Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
- MySQL 动态sql语句执行 用时间做表名
- oracle查询时通过分组去除重复行,其实这样写更简洁些