Java 杂谈

设计模式(1)-策略模式

2018-10-25  本文已影响0人  6plus

定义

策略模式(Strategy)定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

思考与理解

以勇士使用武器进行战斗这一事件为例:

使用算法的客户,可以理解为勇士,而算法族就是勇士的武器库。

武器库由一个接口和若干具体武器类组成,接口中定义一个attack()方法,而具体武器根据各自的效果实现这个attack()方法,上到霜之哀伤下到代达罗斯之殇,暴击减速等等。如果算法变化了,比如代达罗斯之殇拆成了水晶剑,其变化是被封装在对应的武器类之中的。

public interface weapon{
    void attack();
}
public class Daedalus implement weapon{
    @Override
    void attack(){
        System.out.println("critical strike");
    }
}

勇士类,一把武器构造一个英雄,有4个域,一个武器的私有域,一个传入武器进行构造的构造器,一个更改武器的方法和一个战斗(调用武器的attack())的方法。

public class Brave{
    private Weapon weapon;
    public Brave(Weapon weapon) {this.weapon=weapon;}
    public void changeWeapon(Weapon weapon) {this.weapon=weapon;}
    public void goToBattle() {weapon.attack();}
} 

于“我们”进行剧本的安排,在main函数中进行测试,使用任意武器构造一个勇士,并调用勇士进行攻击,最后造成的攻击效果不同。

public static void main(String[] args){
    Brave brave=new Brave(new Daedalus());
    brave.goToBattle();
    brave.changeWeapon(new Frostmourne());
    brave.goToBattle();
}

以上的过程是一个简单的策略模式的例子,将使用算法的客户与算法的变化相独立,当算法(武器)变化时,客户调用算法的方法(实际调用attack()方法)仍然不变。

在这个例子中对于将具体的实现放到了算法类中,而客户(勇士)使用时仅仅只有一个切换武器以及战斗(调用attack())接口。将变化的与不变的代码分开,体现了设计模式的封装变化,针对接口编程,不针对实现编程的原则

平常项目中想要做到自然而然,信手拈来的将变与不变分开,需要丰富的经验和敏锐的嗅觉,努力,加油_

参考:Head First 设计模式github代码

上一篇 下一篇

猜你喜欢

热点阅读