***
策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户。
优点 | 缺点 |
---|---|
算法可以自由切换 | 策略类会增多 |
避免使用多重条件判断 | 所有策略类都需要对外暴露 |
扩展性良好 |
***
有几种鹅:天鹅、野鹅、灰鹅,鹅有各种行为,如飞、游泳、叫等。
假设天鹅灰鹅飞行能力一般,野鹅飞行能力优秀;天鹅野鹅游泳能力一般,灰鹅游泳能力优秀。
首先看第一种方法:
这种方法固然可以实现目的,但问题显而易见,子类过多覆盖父类方法,代码未复用,耦合度很高。
使用策略模式,简单来说,就是封装子类行为成接口,父类包含该接口即可。
(
插播反爬信息)博主CSDN地址:https://wzlodq.blog.csdn.net/代码:
public interface FlyBehavior {
void fly();
}
public class FlyGood implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞行能力优秀");
}
}
public class FlyNormal implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞行能力一般");
}
}
public interface SwimBehavior {
void swim();
}
public class SwimGood implements SwimBehavior {
@Override
public void swim() {
System.out.println("游得好");
}
}
public class SwimNormal implements SwimBehavior {
@Override
public void swim() {
System.out.println("游得一般");
}
}
public abstract class Goose {
//策略接口
FlyBehavior flyBehavior;
SwimBehavior swimBehavior;
//其他属性等...
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setSwimBehavior(SwimBehavior swimBehavior) {
this.swimBehavior = swimBehavior;
}
}
public class Swan extends Goose{
public Swan() {
flyBehavior=new FlyNormal();
swimBehavior=new SwimNormal();
}
}
public class WildGoose extends Goose{
public WildGoose() {
flyBehavior=new FlyGood();
swimBehavior=new SwimNormal();
}
}
public class GreyGoose extends Goose{
public GreyGoose() {
flyBehavior=new FlyNormal();
swimBehavior=new SwimGood();
}
}
public class Client {
public static void main(String[] args) {
Swan swan=new Swan();
swan.flyBehavior.fly();
WildGoose wildGoose=new WildGoose();
wildGoose.swimBehavior.swim();
GreyGoose greyGoose=new GreyGoose();
greyGoose.flyBehavior.fly();
greyGoose.setFlyBehavior(new FlyGood()); //改变某个对象的行为
greyGoose.flyBehavior.fly();
}
}
运行结果:
原创不易,请勿转载(
本不富裕的访问量雪上加霜)博主首页:https://wzlodq.blog.csdn.net/
微信公众号:
唔仄lo咚锵
如果文章对你有帮助,记得一键三连❤
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。