设计模式之策略模式

本文详细介绍了策略模式的设计原则,包括面向接口编程和多用组合。通过实例展示了如何实现策略接口及其具体策略类,并在客户端程序中选择和组装策略。策略模式有利于提高代码灵活性,应对变化,避免大量条件语句,但也可能导致客户代码了解过多实现细节。适用场景包括行为差异的类和运行时选择不同算法。文章通过鸭子类的例子,阐述了策略模式在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

策略模式的设计原则:
    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();




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值