设计模式一之策略模式

来源:互联网 发布:文件夹加密软件破解版 编辑:程序博客网 时间:2024/05/18 21:42


定义:
定义算法族并封装,可相互替换。让算法的变化独立于使用算法的客户。


这里就举超人的例子来说明,假定一个超人类 Super  是生产各种超人的


public abstract class Super{//超人的飞行void public Fly(){System.out.println("我是超人我会飞");}//超人的每个技能都不相同,这里提供多态public abstract Skill(); //超人的变身能力(假定为通用属性)public void Shape(){System.out.println("我是超人一定会变身");}}



但超人们有些会飞,有些不会飞,怎么办了,这时候我们就应该引入接口类Flyable

public interface Flyable{void Fly();}


引入后,我们需要继承接口类,并实现Fly方法

public Flywithpower implments Flyable(){public void Fly(){System.out.println("我是超人我会飞");}}public Flynoways implments Flyable(){public void Fly(){System.out.println("我是超人但我不会飞");}}

此时我们的 飞行 方法已经准备好了,这时候可以改造  Super 类了(在Super中引入接口类)

public abstract class Super{//只需引入接口类,就可以实例化其他继承类了Flyable flyable;//使用接口类对应的方法void performFly(){flyable.Fly();}//设置动态行为,改变飞行动作void setFly(Flyable fly){flyable = fly;}//超人的每个技能都不相同,这里提供多态public abstract void Skill(); //超人的变身能力(假定为通用属性)public void Shape(){System.out.println("我是超人一定会变身");}}

这时候咸蛋超人出来了 Superbadegg

class Superbadegg extends Super{//构造函数自动实例化飞行接口类Superbadegg(){flyable = new Flywithpower();}public void Skill(){System.out.println("动感光波");}}


终于搭好了框架,是时候生产超人了

public static void main(String args[]){//上转型Super super = new Superbadegg();//调用继承了飞行接口类的  我会飞super.performFly();//然而这个时候超人被打残了,连飞都飞不起起来了,这需要我们改变其飞行属性super.setFly(new Flynoways());super.performFly();}


结果:我是超人我会飞  

我是超人但我不会飞                       得意得意得意

感悟:为可枚举且变化独立提供接口 (如飞行)

在Super中声明接口类并在方法中调用

在Super子类中实例化飞行接口类

在主类中使用上转型并调用fly方法

定义:

定义了算法族,并分别封装起来,让它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。

例子:魂斗罗(更换子弹的类型)

5 0
原创粉丝点击