博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之策略模式
阅读量:5977 次
发布时间:2019-06-20

本文共 2758 字,大约阅读时间需要 9 分钟。

hot3.png

策略模式:定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于算法的客户.此模式主要使用的设计原则是依赖倒置原则.

使用鸭子来举个列子,鸭子分为家鸭,野鸭,木头鸭。家鸭能叫不能飞,野鸭能叫又能飞,木头鸭不能叫也不能飞。 那么我们就可以把飞和叫定义为两个不同的算法族。

飞行算法族:

/** *飞行算法族 * @author zhuleqi */public  interface FlyBehavior {    public void fly();}
/** *使用翅膀飞行 * @author zhuleqi */public class FlyWithWings implements FlyBehavior{    @Override    public void fly() {        System.err.println("fly with wing");    }    }
/** *不能飞行 * @author zhuleqi */public class NoFly implements FlyBehavior{    @Override    public void fly() {        System.err.println("I can't fly");    }    }

叫算法族:

/** *叫算法族 * @author zhuleqi */public interface QuackBehavior {    public void quack();}
/** * * @author zhuleqi */public class NormalQuack implements QuackBehavior{    @Override    public void quack() {        System.err.println("我是一只正常叫的鸭子");    }    }
/** * * @author zhuleqi */public class NoQuack implements QuackBehavior{    @Override    public void quack() {        System.err.println("I can not quack");    }    }

这两个算法族都使用了依赖倒置的原则,这个原则的好处是:易于扩展。比如:某天突然需要增加一个安装了火箭喷射器的唐老鸭,我们就只需要在实现这两个算法接口,而不用破坏程序结构。

算法族的使用者鸭子:

/** * 算法族的客户 * @author zhuleqi */public  class Duck {    /**     * 鸭子的飞行行为     */    private FlyBehavior flyBehavior;    /**     * 鸭子的叫     */    private QuackBehavior quackBehavior;    public void display() {        System.err.println(" 我是鸭子");    }    public void swim() {        System.err.println(" 我可以在水里游");    }    public void fly() {        if(this.getFlyBehavior() == null){            return;        }        this.getFlyBehavior().fly();    }       public void quack() {        if(this.getQuackBehavior() == null){            return ;        }        this.getQuackBehavior().quack();    }    /**     * @return the flyBehavior     */    public FlyBehavior getFlyBehavior() {        return flyBehavior;    }    /**     * @param flyBehavior the flyBehavior to set     */    public void setFlyBehavior(FlyBehavior flyBehavior) {        this.flyBehavior = flyBehavior;    }    /**     * @return the quackBehavior     */    public QuackBehavior getQuackBehavior() {        return quackBehavior;    }    /**     * @param quackBehavior the quackBehavior to set     */    public void setQuackBehavior(QuackBehavior quackBehavior) {        this.quackBehavior = quackBehavior;    }    }

执行一下:

/** *  策略模式定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于算法的客户.主要使用的设计原则是依赖倒置原则. * * @author zhuleqi */public class Strategy {    public static void main(String[] args) {        Duck duck = new Duck();        duck.setFlyBehavior(new FlyWithWings());        duck.setQuackBehavior(new NormalQuack());        print(duck);    }    private static void print(Duck duck) {        duck.display();        duck.fly();        duck.quack();    }}

转载于:https://my.oschina.net/u/587323/blog/689209

你可能感兴趣的文章
openstack 之 windows server 2008镜像制作
查看>>
VI快捷键攻略
查看>>
Win server 2012 R2 文件服务器--(三)配额限制
查看>>
卓越质量管理成就创新高地 中关村软件园再出发
查看>>
linux rsync 远程同步
查看>>
httpd的manual列目录漏洞
查看>>
myeclipse2014破解过程
查看>>
漫谈几种反编译对抗技术
查看>>
Timer 和 TimerTask 例子
查看>>
Spring BOOT 集成 RabbitMq 实战操作(一)
查看>>
安装python3.5注意事项及相关命令
查看>>
进程通信之无名信号量
查看>>
并发串行调用接口
查看>>
FileStream大文件复制
查看>>
Hibernate学习之SessionFactory的opensession 和 getCu...
查看>>
web网站服务(二)
查看>>
【第一期】网站打开错误问题解决方法集合
查看>>
j2ee开发防范URL攻击是个重要话题
查看>>
RSync实现文件备份同步
查看>>
如何判断一个服务是否正在运行
查看>>