设计模式(二)策略模式

2019-03-10  本文已影响0人  Active_Loser

总章目录,设计模式(一)基本介绍

一、定义

策略模式:策略模式定义了算法族,分别封装起来,让他们之间可以互相转换,此模式算法的变化独立于使用算法的客户,但是策略模式造成很多的策略类。
策略模式主要包含以下角色。
Contex: 环境类,持有一个策略类的引用,最终给客户端调用。
Strategy: 抽象策略(Strategy)类:定义公共接口,使用接口或抽象类实现。
ConcreteStrategy: 实现了抽象策略定义的接口

二、使用场景

策略模式使我们的程序更易于维护和扩展。因此,当我们通常需要在这些场景中选择策略模式:
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

三、简单案列

我们知道猴子有七十二变,通过变身可以有各种变化,猴子本身就是一个Context,它有一个变身的技能,可以变声也可以恢复真身。
Contex:

public class Monkey {

    Morph morph;

    public Monkey(Morph morph) {
        this.morph = morph;
    }

    public void show(){
        morph.change();
    }

    public void setMorph(Morph morph) {
        this.morph = morph;
    }
}

Strategy:

public interface Morph {
    void change();
}

ConcreteStrategy:

public class NoMorph implements Morph {

    @Override
    public void change() {
        System.out.println("真身");
    }
}

public class DragonMorph implements Morph {
    @Override
    public void change() {
        System.out.println("变身为龙");
    }
}

测试使用

public class StrategyTest {

    @Test
    public void MonkeyTst(){
        Monkey monkey=new Monkey(new NoMorph());
        monkey.show();

        monkey.setMorph(new DragonMorph());
        monkey.show();
    }
}

打印:
真身
变身为龙
上一篇下一篇

猜你喜欢

热点阅读