策略模式


策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

策略模式的组成:
1.抽象策略角色:策略类,通常由一个接口或者抽象类实现
2.具体策略角色:包装了相关的算法和行为
3.环境角色:持有一个策略类的引用,最终给客户端调用的。

策略模式的编写步骤:
1.对策略对象定义一个公共接口
2.编写策略类,该类实现了上面的公共接口
3.在使用策略对象的类中保存一个对策略对象的引用

抽象策略角色:
package com.cjh.strategy;
/**
 * 策略公共接口(武器接口)
 * 
 * @author cjh
 * 
 */
public interface WeaponBehavior {
    /**
     * 使用武器方法
     * 
     * @return
     */
    public String useWeapon();
}

具体策略角色1:
package com.cjh.strategy.impl;
import com.cjh.strategy.WeaponBehavior;
/**
 * 策略实现(斧头类)
 * 
 * @author cjh
 * 
 */
public class AxeBehavior implements WeaponBehavior {
    /**
     * 使用的武器方法
     */
    @Override
    public String useWeapon() {
        return "斧头";
    }
}

具体策略角色2:
package com.cjh.strategy.impl;
import com.cjh.strategy.WeaponBehavior;
/**
 * 策略实现(弓箭类)
 * 
 * @author cjh
 * 
 */
public class BowAndArrowBehavior implements WeaponBehavior {
    /**
     * 使用的武器方法
     */
    @Override
    public String useWeapon() {
        return "弓箭";
    }
}
具体策略角色3:
package com.cjh.strategy.impl;
import com.cjh.strategy.WeaponBehavior;
/**
 * 策略实现(匕首类)
 * 
 * @author cjh
 * 
 */
public class KinfeBehavior implements WeaponBehavior {
    /**
     * 使用的武器方法
     */
    @Override
    public String useWeapon() {
        return "匕首";
    }
}

具体策略角色4:
package com.cjh.strategy.impl;
import com.cjh.strategy.WeaponBehavior;
/**
 * 策略实现(宝剑类)
 * 
 * @author cjh
 * 
 */
public class SwordBehavior implements WeaponBehavior {
    /**
     * 使用的武器方法
     */
    @Override
    public String useWeapon() {
    
        return "宝剑";
    }
}

抽象环境角色:
package com.cjh.environment;
import com.cjh.strategy.WeaponBehavior;
/**
 * 环境角色(角色抽象类)
 * 
 * @author cjh
 * 
 */
public abstract class Character {
    /**
     * 持有策略公共接口的引用
     */
    private WeaponBehavior weapon;
    /**
     * 策略get方法
     * 
     * @return
     */
    public WeaponBehavior getWeapon() {
        return weapon;
    }
    /**
     * 策略set方法
     * 
     * @param weapon
     *            策略引用
     */
    public void setWeapon(WeaponBehavior weapon) {
        this.weapon = weapon;
    }
    /**
     * 环境角色方法具体由子类实现
     */
    public abstract void fight();
}
环境角色1:
package com.cjh.environment.impl;
import com.cjh.environment.Character;
/**
 * 环境角色实现(国王角色类)
 * 
 * @author cjh
 * 
 */
public class King extends Character {
    /**
     * 环境角色方法实现
     */
    @Override
    public void fight() {
        
        System.out.println("国王使用了" + this.getWeapon().useWeapon());
    }
}

环境角色2:
package com.cjh.environment.impl;
import com.cjh.environment.Character;
/**
 * 环境角色实现(武士角色类)
 * 
 * @author cjh
 * 
 */
public class Knight extends Character {
    /**
     * 环境角色方法实现
     */
    @Override
    public void fight() {
        
        System.out.println("武士使用了"+this.getWeapon().useWeapon());
    }
}

环境角色3:
package com.cjh.environment.impl;
import com.cjh.environment.Character;
/**
 * 环境角色实现(女王)
 * 
 * @author cjh
 * 
 */
public class Queen extends Character {
    /**
     * 环境角色方法实现
     */
    @Override
    public void fight() {
        System.out.println("女王使用了"+this.getWeapon().useWeapon());
    }
}

环境角色4:
package com.cjh.environment.impl;
import com.cjh.environment.Character;
/**
 * 环境角色实现(巨魔角色类)
 * 
 * @author cjh
 * 
 */
public class Troll extends Character {
    /**
     * 环境角色方法实现
     */
    @Override
    public void fight() {
        
        System.out.println("巨魔使用了"+this.getWeapon().useWeapon());
    }
}

最终用户:
package com.cjh.client;
import com.cjh.environment.impl.King;
import com.cjh.environment.impl.Knight;
import com.cjh.environment.impl.Queen;
import com.cjh.environment.impl.Troll;
import com.cjh.strategy.WeaponBehavior;
import com.cjh.strategy.impl.AxeBehavior;
import com.cjh.strategy.impl.BowAndArrowBehavior;
import com.cjh.strategy.impl.KinfeBehavior;
import com.cjh.strategy.impl.SwordBehavior;
/**
 * 最终用户类
 * 
 * @author cjh
 * 
 */
public class Client {
    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("------默认武器------\n");
        
        WeaponBehavior weapon = new AxeBehavior();
        King king = new King();
        king.setWeapon(weapon);
        king.fight();
        System.out.println("-----------");
        
        weapon = new KinfeBehavior();
        Queen queen = new Queen();
        queen.setWeapon(weapon);
        queen.fight();
        System.out.println("-----------");
        
        weapon = new SwordBehavior();
        Knight knight = new Knight();
        knight.setWeapon(weapon);
        knight.fight();
        System.out.println("-----------");
        
        weapon = new BowAndArrowBehavior();
        
        Troll troll = new Troll();
        
        troll.setWeapon(weapon);
        
        troll.fight();
        
        System.out.println("\n------更换武器------\n");
        
        king.setWeapon(weapon);
        
        king.fight();
    }
}
文章来自: http://www.myopenresources.com/page/resource_detail_1.html?rid=286 更多文章请进入: http://www.myopenresources.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河马开源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值