美文网首页Java 杂谈
设计模式(1)-策略模式

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

作者: 6plus | 来源:发表于2018-10-25 09:13 被阅读0次

    定义

    策略模式(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代码

    相关文章

      网友评论

        本文标题:设计模式(1)-策略模式

        本文链接:https://www.haomeiwen.com/subject/zkqqtqtx.html