【设计模式】策略模式

策略模式

为了满足不同子类具有不同的行为而设计

而且,它可以提供行为/算法的互换,使行为具有可变性

而且,支持扩展新的行为而不影响原有的代码

Sample1:

package pattern.strategy;

/**
 * 策略模式
 *	实现一组可相互切换的行为类/算法簇
 */
public class StrategyExample {
	public static void main(String[] args) {
		int a = 1, b = 2;
		Strategy originalStrategy = new Add();
		Context c = new Context(originalStrategy);
		int result = c.executeStrategy(a, b);
		System.out.println(result);
		
		//当某种条件发生时,切换策略
		Strategy newStrategy = new Subtract();
		c.changeStrategy(newStrategy);
		result = c.executeStrategy(a, b);
		System.out.println(result);
		
	}
}

class Context {
	private Strategy strategy;
	
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	
	//对外提供改变策略的方法
	public void changeStrategy(Strategy strategy) {
		this.strategy = strategy;
	}
	
	public int executeStrategy(int a, int b) {
		return this.strategy.execute(a, b);
	}
}

/**
 * 找出可能会发生变化的地方,独立进行封装
 * 策略经常发生变化,所以要将其独立出来,与那些不变的代码进行隔离
 */
interface Strategy {
	int execute(int a, int b);
}

class Add implements Strategy {
	public int execute(int a, int b) {
		return a + b;
	}
}

class Subtract implements Strategy {
	public int execute(int a, int b) {
		return a - b;
	}
}

class Multiply implements Strategy {
	public int execute(int a, int b) {
		return a * b;
	}
}


Sample 2:

package pattern.strategy;


public class FightDemo {
	public static void main(String[] args) {
		Character c = new Knight();
		c.setWeapon(new AxeBehavior());
		c.fight();
		
		//更换武器
		c.setWeapon(new SwordBehavior());
		c.fight();
	}
}

//=========================================

abstract class Character {
	protected WeaponBehavior weapon;
	void setWeapon(WeaponBehavior w) {
		this.weapon = w;
	}
	abstract void fight();
}

class Knight extends Character {
	@Override
	void fight() {
		System.out.println(Knight.class.getName() +" is fighting...");
		this.weapon.useWeapon();
	}
}

class King extends Character {
	@Override
	void fight() {
		System.out.println(King.class.getName()  +" is fighting...");
		this.weapon.useWeapon();
	}
}

//=========================================

/**
 * 行为接口
 */
interface WeaponBehavior {
	void useWeapon();
}

//行为一
class SwordBehavior implements WeaponBehavior {
	public void useWeapon() {
		System.out.println("Use sword!");
	}
}

//行为二
class AxeBehavior implements WeaponBehavior {
	public void useWeapon() {
		System.out.println("Use axe!");
	}
}	

猜你喜欢

转载自just2learn.iteye.com/blog/2096990