23种设计模式之策略模式

今天我向大家讲解一下23种设计模式中的策略模式,后期我会持续向大家讲解其他设计模式。

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

策略模式的原则一共有三点:

第一点为封装变化,封装变化通俗意思就是,将一个对象中的会变化的事物封装起来,来因此做到其他类不收到影响,使代码更富有弹性;

第二点为针对接口编程而不是实现编程,意思也就是针对超类型编程,执行程序时会根据执行到真正的行为,不会绑死在超类型上面;

第三点为多用组合,少用继承,形成松耦合,这个是为了代码能更好的复用,也是为了使得代码灵活性高,不必改动全部代码。

下图我画的一个uml的图形,WeaponBehavior为一个打架的一个接口,封装了多种打架的方法,其实这就是策略模式,非常简单,下面我奉上一个题目的代码。


题目告诉我们,有一个国王,和王后,他们夫妻两个今天因为某件事情而吵架,吵架的非常严重,以至于他们已经开始打起来了。打架的工具有四种类,这里国王用的SwordBehavior类进行打架,王后用的KnifeBehavio类r进行打架,请注意,这里要用策略模式,您需要通过一个抽象类Charactor类使得国王和王后继承,并将setWeapon()方法放入正确的类中





首先,我们需要先将接口声明,然后在写子类继承超类的方法。

package way;


public interface WeaponBehavior {
public void useWeapon();


}

下面为四个方法;

package way;


public class SwordBehavior implements WeaponBehavior {
public void useWeapon(){
System.out.println("实现用宝剑挥舞");
}


}


package way;


public class KnifeBehavior implements WeaponBehavior{
public void useWeapon(){
System.out.println("实现用匕首刺杀");


}

}


package way;


public class BowAndArrowBehavior implements WeaponBehavior{
public void useWeapon(){
System.out.println("实现用弓箭射击");
}


}


package way;


public class AxeBehavior implements WeaponBehavior{
public void useWeapon(){
System.out.println("实现用斧头砍劈");
}


}


再次,我们需要一个抽象类Charactor将WeaponBehavior接口联系起来,并且封装Charator类使得国王和王后继承Charactor类。

package show;
import way.*;


public abstract class Character {
WeaponBehavior weapon;
public abstract void fight();

public void performFight(){
weapon.useWeapon();
}

public void setWeapon(WeaponBehavior w){
this.weapon = w;

}




}


然后,我们开始用国王King类和王后Queen类继承抽象类Charactor,实现fight()方法.

package show;


import way.SwordBehavior;


public class King extends Character{
public King(){
weapon = new SwordBehavior();
}
public void fight(){
weapon.useWeapon();
}


}



package show;
import way.*;


public class Queen extends Character{
public Queen(){
weapon = new KnifeBehavior();
}
public void fight(){
weapon.useWeapon();
}


}

最后再到主程序中输出就可以了。

package main;
import show.Character;
import show.King;
import show.Queen;
import way.*;


public class Minifight {
public static void main(String[] args){
Character queen = new Queen();
queen.setWeapon(new KnifeBehavior());
queen.performFight();

Character king =  new King();
queen.setWeapon(new SwordBehavior());
queen.performFight();
}


}


猜你喜欢

转载自blog.csdn.net/masterpieve/article/details/79713061