策略模式

来源:互联网 发布:粒子滤波算法及其应用 编辑:程序博客网 时间:2024/06/06 17:03

文章来自:http://www.myopenresources.com/page/resource_detail_1.html?rid=287  更多文章请进入:我的开源网

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

策略模式的组成:
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/