设计模式之策略模式

本文介绍了策略模式的概念,如何在类中定义和使用策略接口,以及它在应对多种行为变化和代码解耦方面的应用。实例展示了如何在`Zombie`类中使用`Moveable`和`Attackable`接口,以及Spring和JDK源码中的实际应用。
摘要由CSDN通过智能技术生成

策略模式

Strategy

模式定义:

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式的变

化独立于算法的使用者。

案例:

类型

外观

移动

攻击

普通僵尸

普通

朝着一个方向移动

旗手僵尸

普通+手持旗子

朝着一个方向移动

类型

外观

移动

攻击

普通僵尸

普通

朝着一个方向移动

旗手僵尸

普通+手持旗子

朝着一个方向移动

大头僵尸

大头

朝着一个方向移动

头撞

石膏僵尸

石膏装

一拐一瘸

武器

xx僵尸

...

...

...

package com.tuling.designpattern.strategy.v2;

/**
 * @author 腾讯课堂-图灵学院  郭嘉
 * @Slogan 致敬大师,致敬未来的你
 */
public class StrategyTest {
    public static void main(String[] args) {
       Zombie zombie=new NormalZombie(  );
       zombie.display();

       zombie.attack();
       zombie.move();

        zombie.setAttackable( new BiteAttack() );
        zombie.attack();
    }
}
interface Moveable{
    void move();
}
interface Attackable{
    void attack();
}
abstract class Zombie{
    abstract public void display();
    Moveable moveable;
    Attackable attackable;

    public Zombie(Moveable moveable, Attackable attackable) {
        this.moveable=moveable;
        this.attackable=attackable;
    }

    abstract void move();
    abstract void attack();

    public Moveable getMoveable() {
        return moveable;
    }

    public void setMoveable(Moveable moveable) {
        this.moveable=moveable;
    }

    public Attackable getAttackable() {
        return attackable;
    }

    public void setAttackable(Attackable attackable) {
        this.attackable=attackable;
    }
}


class StepByStepMove implements Moveable{

    @Override
    public void move() {

        System.out.println("一步一步移动.");
    }
}

class BiteAttack implements Attackable{

    @Override
    public void attack() {
        System.out.println("咬.");
    }
}

class HitAttack implements Attackable{

    @Override
    public void attack() {
        System.out.println("打.");
    }
}

class FlagZombie extends Zombie{

    public FlagZombie(){
        super(new StepByStepMove(),new BiteAttack());
    }

    public FlagZombie(Moveable moveable, Attackable attackable) {
        super( moveable, attackable );
    }

    @Override
    public void display() {
        System.out.println("我是旗手僵尸.");
    }

    @Override
    void move() {
         moveable.move();
    }

    @Override
    void attack() {
        attackable.attack();
    }
}


class NormalZombie extends Zombie{

    public NormalZombie(){
          super(new StepByStepMove(),new BiteAttack());
    }

    public NormalZombie(Moveable moveable, Attackable attackable) {
        super( moveable, attackable );
    }

    @Override
    public void display() {
        System.out.println("我是普通僵尸.");
    }

    @Override
    void move() {
        moveable.move();
    }

    @Override
    void attack() {
        attackable.attack();
    }
}

应用场景

1.当你有很多类似的类,但它们执行某些行为的方式不同时,请使用此

策略。

2.使用该模式将类的业务逻辑与算法的实现细节隔离开来,这些算法在

逻辑上下文中可能不那么重要。

3.当你的类具有大量的条件运算符,并且在同一算法的不同变体之间切

换时,请使用此模式。

优点:

1.可以将算法的实现细节与使用它的代码隔离开来。

2.符合开闭原则

Spring &JDK 源码中的应用

1 java.util.Comparator

2 org.springframework.beans.factory.support.InstantiationStrategy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值