If you can NOT explain it simply, you do NOT understand it well enough
**介绍:**定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
**主要解决:**在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
**何时使用:**一个系统有许多许多类,而区分它们的只是他们直接的行为。
**如何解决:**将这些算法封装成一个一个的类,任意地替换。
**关键代码:**实现同一个接口。
应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
**注意事项:**如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
设计原则:
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
针对接口编程,而不是针对实现编程。
多用组合,少用继承
/**
* 描述:策略模式
* Created by zjw on 2018-12-12 20:31
*/
public class StrategyTest {
public static void main(String[] args) {
Character c = new King();
c.setWeapon(new AxeBehavior()).fight();
c.setWeapon(new BowAndArrowBehavior()).fight();
c.setWeapon(new KnifeBehavior()).fight();
c.setWeapon(new SwordBehavior()).fight();
Character c1 = new Queen();
c1.setWeapon(new AxeBehavior()).fight();
c1.setWeapon(new BowAndArrowBehavior()).fight();
}
// 武器行为接口
interface WeaponBehavior {
//怎么使用武器
void useWeapon();
}
static class AxeBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("三板斧");
}
}
static class BowAndArrowBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("弓箭射击");
}
}
static class KnifeBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("匕首刺杀");
}
}
static class SwordBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("剑斩");
}
}
// 角色抽象
static abstract class Character {
public WeaponBehavior weapon;
public abstract void fight();
public Character setWeapon(WeaponBehavior weapon) {
this.weapon = weapon;
return this;
}
}
static class King extends Character {
@Override
public void fight() {
System.out.print(this.getClass().getSimpleName()+ ":发动");
super.weapon.useWeapon();
}
}
static class Knight extends Character {
@Override
public void fight() {
System.out.print(this.getClass().getSimpleName()+ ":发动");
super.weapon.useWeapon();
}
}
static class Queen extends Character {
@Override
public void fight() {
System.out.print(this.getClass().getSimpleName()+ ":发动");
super.weapon.useWeapon();
}
}
static class Troll extends Character {
@Override
public void fight() {
System.out.print(this.getClass().getSimpleName()+ ":发动");
super.weapon.useWeapon();
}
}
}
标签:策略,useWeapon,void,模式,fight,class,static,public
From: https://blog.51cto.com/u_11906056/6984941