设计模式之策略模式

来源:互联网 发布:灵界室友网络剧百度云 编辑:程序博客网 时间:2024/05/18 17:41
策略模式的设计原则:    1.找出应用中需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混在一起    2.面向接口编程,而不是面向实现编程    3.多用组合,少用继承
策略模式的实现    1.通过分离变化得出策略接口Strategy    
public interface FlyingStragety {        void performFly();    }

2.为策略接口提供实现类
 public class FlyingWithWin implements FlyingStragety {        @Override        public void performFly() {            System.out.println("一飞冲天");        }    }
public class FlyingNoway implements FlyingStragety {    @Override    public void performFly() {        System.out.println("我是大黄,我不会飞行");    }}


3.客户程序中要有一个策略引用
  private FlyingStragety mFlyingStragety;        /*        * 用来设置不同的飞行方式        * */        public void setFlyingStragety(FlyingStragety flyingStragety) {            mFlyingStragety = flyingStragety;        }        /*        * 实现飞行方法        * */        public void fly(){            mFlyingStragety.performFly();        }

4.在客户端程序中选择、组装正确的策略实现类
public BigYellowDuck() {                super();                super.setFlyingStragety(new FlyingNoway());            }

策略模式的优点:
1.使用了组合,是架构更加灵活
2.富有弹性,可以较好地应对变化
3.更好的代码复用性
4.消除大量的条件语句

策略模式的缺点:
1.客户代码要了解每个策略实现的细节
2.增加对象的数目策略模式的使用场景

策略模式的使用场景:    1.许多相关的类仅仅是行为的差异    2.运行时选取不同的算法变体
 
典型模型:
1.创建抽象类
public abstract class Duck {    /*    * 通用行为,由超类实现    * */    public void quack(){        System.out.println("嘎嘎嘎");    }    public abstract void disPlay();    private FlyingStragety mFlyingStragety;    /*    * 用来设置不同的飞行方式    * */    public void setFlyingStragety(FlyingStragety flyingStragety) {        mFlyingStragety = flyingStragety;    }    /*    * 实现飞行方法    * */    public void fly(){        mFlyingStragety.performFly();    }}
2.创建子类继承上面抽象类
public class RedheadDuck extends Duck {    public RedheadDuck() {        super();        //将飞行策略实现类设置在不同的种类鸭子类中        super.setFlyingStragety(new FlyingWithWin());    }    @Override    public void disPlay() {        System.out.println("我的头是红色的鸭子");    }}


public class BigYellowDuck extends Duck {    public BigYellowDuck() {        super();        super.setFlyingStragety(new FlyingNoway());    }    @Override    public void disPlay() {        System.out.println("我是一只黄黄的鸭子");    }}
3.主函数
 Duck duck = new RedheadDuck();        duck.disPlay();        duck.quack();        duck.fly();        duck = new BigYellowDuck();        duck.disPlay();        duck.quack();        duck.fly();




0 0
原创粉丝点击