设计模式实例学习-策略模式

来源:互联网 发布:linux mint 安装 wine 编辑:程序博客网 时间:2024/05/25 19:57

设计模式实例学习-策略模式

原创博客,转载请注明出处:
http://blog.csdn.net/u011035622/article/details/49745553

    此前在某公司面试时,面试官问我说有没有自己写什么东西分享,我说有一些,但是很多东西发现别人都写过了,自己慢慢就不太想再写了。他跟我说让我继续坚持写,总会有好处的。后来也知道,写博客有时候也许不一定是分享,也可以是对自己学习的总结,加深印象。秋招对于我,其实在10月末就已经结束了,休息一阵,不敢颓废,现在打算开始写些东西记录自己的学习过程。

定义

(行为模式)

   策略模式,我的理解就是通过将算法策略分别封装起来,面向接口实现,达到可以动态替换不同的算法,改变策略的目的。

此模式让算法的变化独立于使用算法的客户!


实例分析

  • 抽象策略:两个接口
    分别设置学生专业、学生社团

Profession.java

package Strategy;interface Profession {//专业    public void learning();}

Club.java

package Strategy;interface Club{//社团    public void playing();}
  • 学生类

Student.java

package Strategy;public class Student {    private Profession mProfession;    private Club mClub;    public void setProfession(Profession mProfession){//传入具体策略类(专业)        this.mProfession = mProfession;    }    public void setClub(Club mClub){//传入具体策略类(社团)        this.mClub = mClub;    }    public void makeIntroduction(){//作个自我介绍        mProfession.learning();        mClub.playing();    }}

可以看到,student类中有两个内部的接口,分别用于策略的设置实现。事实上经常写回调接口的话,这个东西一看也很容易知道。

  • 在Main中测试实现。

另外为了方便,我实现接口的具体策略类也放到了这里面=。=

package Strategy;public class Main {    public static void main(String[] args) {        Student hww = new Student();        hww.setProfession(new CommunicationsPro());        hww.setClub(new InformationClub());        hww.makeIntroduction();        System.out.println("\n____把每个专业或社团当做一种策略算法,面向接口来设置对应的具体策略,可以动态更改____\n");        hww.setProfession(new PhysicsPro());        hww.setClub(new StudentUnioClub());        hww.makeIntroduction();    }}/*    以下均为具体策略类——————————————————*/class CommunicationsPro implements Profession{//通信专业    @Override    public void learning() {        System.out.println("通信专业什么都搞。。");    }}class PhysicsPro implements Profession{//物理专业    @Override    public void learning() {        System.out.println("专心学物理。");    }}class ChemistryPro implements Profession{//化学专业    @Override    public void learning() {        System.out.println("专心学化学。");    }}class InformationClub implements Club{//信息中心社团    @Override    public void playing() {        System.out.println("玩视频编辑,做海报,组织各种活动。");    }}class DebateClub implements Club{//辩论社团    @Override    public void playing() {        System.out.println("打辩论赛。");    }}class StudentUnioClub implements Club{//校学生会    @Override    public void playing() {        System.out.println("开会。再开会。继续开会。");    }}
  • 输出:
通信专业什么都搞。。玩视频编辑,做海报,组织各种活动。____把每个专业或社团当做一种策略算法,面向接口来设置对应的策略,可以动态更改____专心学物理。开会。再开会。继续开会。

实例如期输出。


策略模式优缺点

优点就是弹性强,算法独立于客户,更改算法不用对客户类进行修改,减少修改功能时对整体的代码的影响,而且能够动态的对算法策略进行修改。

.

缺点是每多一种算法,类增加一个,导致类数量众多,且客户需要了解所有策略类的功能,自行对选择实现策略进行判断。可以通过结合工厂方法、代理或享元模式弥补这个缺点


策略模式的使用场景

  1. 多个类只有在算法或行为上有所不同。
  2. 需要动态设置算法行为时。
  3. 需要屏蔽具体的算法细节时。

1 0