【设计模式】--策略者模式

一、什么是策略者模式

策略者模式是一种解决 改变 的方案,其核心是将问题剥离,把不会改变的和可变的内容区分开来。在发生改变时只需修改可变的类,即可在改动程序时产生最小的影响。并使用组合将 不变的与可变的组合起来。使程序易扩展和可维护。

二 、策略者模式解决了什么问题

在软件开发中最常见的问题就是改变,策略者模式可以解决“改变”的问题。
在开发中可能会经常遇到需求改变的问题,因此我们在设计类时应充分考虑未来可能发生的扩展。比如为已经上线的某个模块中为某个功能进行扩展,使用策略者设计模式在上线前设计未来可能发生扩展的类,将原始类与扩展类分离使用组合,使得在修改一处时对整体功能不会产生很大的影响,而不会使程序在修改后牵一发动全身,变得难以修改和维护。

三、策略者模式思维图

在这里插入图片描述

四、策略者模式的示例

这里使用《head:first设计模式》一书中经典的 Duck 例子阐述。

解析相同与不同:
相同:(不变处)
鸭子们都有颜色,都会游泳。
不同:(可变处)
鸭子们有的吱吱叫有的呱呱叫。有的会飞有的不会飞。

不变

首先设计“不变的类”因为其子类们依然有不同处所以将类声明为抽象类


/*设计一个鸭子超类,使用组合的方式将不变的与改变的组合在一起*/
public abstract class  Duck {

    /*---------------------可变的----------------------*/

    /*将可变的声明为属性*/
    public FlyBehavior flyBehavior;
    public QuackBehavior quackBehavior;

    /*---------------------不变的-----------------------*/

    /*提供颜色*/
    public abstract void colour();//每一种鸭子都有不同的颜色
    /*提供游泳*/
    public void swim(){
        System.out.println("我在游泳");
    }

    /*-------------------提供对可变得,进行修改的方法-------------------------*/

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    /*-------------------使用 *可变* 的-------------------------*/

    /*为鸭子提供飞行行为*/
    public void performFlying(){
        flyBehavior.flying();
    }

    /*为鸭子提供叫的行为*/
    public void performQuack(){
        quackBehavior.quack();
    }

}

可变

设计叫声行为接口


public interface QuackBehavior {

    /*设计叫的抽象方法*/
    void quack();

}

设计叫声行为的两个实现类


public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("嘎嘎叫........");
    }
}


public class Squeak implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("吱吱叫............");
    }
}

设计飞行行为接口

 /*飞行接口*/
public interface FlyBehavior {

    /*设计飞行的抽象方法*/
    void flying();
}

设计飞行行为的两个实现类


public class FlUpward implements FlyBehavior {
    @Override
    public void flying() {
        System.out.println("向上飞行..........");
    }
}

public class FlyForward implements FlyBehavior {
    @Override
    public void flying() {
        System.out.println("向前飞行......");
    }
}


实现一个鸭子类

/*实现一个绿头鸭子 子类*/
public class GreenDuck extends Duck {

    /*在创建鸭子类时 为鸭子指定默认行为*/
    public GreenDuck(){
        flyBehavior = new FlUpward();
        quackBehavior = new Quack();
    }

    /*鸭子的颜色实现*/
    @Override
    public void colour() {
        System.out.println("我是绿色飞鸭子");
    }


}

测试


public class test {

    public static void main(String[] args) {

        GreenDuck greenDuck = new GreenDuck();
        /*鸭子的颜色*/
        greenDuck.colour();//我是绿色飞鸭子
        /*鸭子在游泳*/
        greenDuck.swim();//我在游泳

        /*动态的指定鸭子以那种方式飞行*/
        greenDuck.setFlyBehavior(new FlyForward());
        /*调用飞行*/
        greenDuck.performFlying();//向上飞行..........


        /*动态的指定鸭子的叫声*/
        greenDuck.setQuackBehavior(new Squeak());
        /*调用名叫*/
        greenDuck.performQuack();//嘎嘎叫........


    }
}

五、策略者模式中的设计原则

针对接口编程而不是针对实现编程。

找出应用中可能需要变化之处,把他们独立起来, 不要和那些不需要变化的代码混在一起。

多用组合少用继承

六 、关键词

分离 组合 动态指定

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值