public class FirstGun implements Weapon { @Override public void gun() { System.out.println("使用AWM狙击步枪。"); } }
public class SecondGun implements Weapon { @Override public void gun() { System.out.println("使用S12K霰弹枪。"); } }
(3)定义一个环境类(Contex),类中持有一个对公共接口的引用,以及相应的get、set方法、构造方法
public class Context { Weapon weapon; public Context(Weapon weapon) { //构造函数 super(); this.weapon = weapon; } public Weapon getWeapon() { //get方法 return weapon; } public void setWeapon(Weapon weapon) { //set方法 this.weapon = weapon; } public void gun() { weapon.gun(); } }
最后,客户端自由调用策略(我在枪林弹雨的战场上,切换武器,击毙敌人)
public class StrategyClient {
public static void main(String[] args) {
//使用构造函数默认选择一把AWM狙击步枪(一个策略)
Context context=new Context(new FirstGun());
context.gun();
//使用get、set方法切换到S12K霰弹枪(切换策略)
System.out.println("------右前方30米发现敌人------");
contex.set(new SecondGun());
context.gun();
}
}
输出结果:
5、策略模式,小结一下:重点在于:给对象传入什么样的策略,就执行什么样的动作。
优点在于:可以轻易的扩展与改变策略,可以动态改变对象的行为。
缺点在于:客户端必须知道所有的策略类,并自行决定使用哪一种。每个具体的策略都会产生一个新类,这样会造成很多策略类。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx