策略模式的设计原则: 1.找出应用中需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混在一起 2.面向接口编程,而不是面向实现编程 3.多用组合,少用继承策略模式的实现 1.通过分离变化得出策略接口Strategy典型模型:public interface FlyingStragety { void performFly(); }
2.为策略接口提供实现类public class FlyingWithWin implements FlyingStragety { @Override public void performFly() { System.out.println("一飞冲天"); } }
public class FlyingNoway implements FlyingStragety { @Override public void performFly() { System.out.println("我是大黄,我不会飞行"); } }
3.客户程序中要有一个策略引用private FlyingStragety mFlyingStragety; /* * 用来设置不同的飞行方式 * */ public void setFlyingStragety(FlyingStragety flyingStragety) { mFlyingStragety = flyingStragety; } /* * 实现飞行方法 * */ public void fly(){ mFlyingStragety.performFly(); }
4.在客户端程序中选择、组装正确的策略实现类public BigYellowDuck() { super(); super.setFlyingStragety(new FlyingNoway()); }
策略模式的优点:
1.使用了组合,是架构更加灵活
2.富有弹性,可以较好地应对变化
3.更好的代码复用性
4.消除大量的条件语句
策略模式的缺点:
1.客户代码要了解每个策略实现的细节
2.增加对象的数目策略模式的使用场景策略模式的使用场景: 1.许多相关的类仅仅是行为的差异 2.运行时选取不同的算法变体
1.创建抽象类2.创建子类继承上面抽象类public abstract class Duck { /* * 通用行为,由超类实现 * */ public void quack(){ System.out.println("嘎嘎嘎"); } public abstract void disPlay(); private FlyingStragety mFlyingStragety; /* * 用来设置不同的飞行方式 * */ public void setFlyingStragety(FlyingStragety flyingStragety) { mFlyingStragety = flyingStragety; } /* * 实现飞行方法 * */ public void fly(){ mFlyingStragety.performFly(); } }
public class RedheadDuck extends Duck { public RedheadDuck() { super(); //将飞行策略实现类设置在不同的种类鸭子类中 super.setFlyingStragety(new FlyingWithWin()); } @Override public void disPlay() { System.out.println("我的头是红色的鸭子"); } }
3.主函数public class BigYellowDuck extends Duck { public BigYellowDuck() { super(); super.setFlyingStragety(new FlyingNoway()); } @Override public void disPlay() { System.out.println("我是一只黄黄的鸭子"); } }
Duck duck = new RedheadDuck(); duck.disPlay(); duck.quack(); duck.fly(); duck = new BigYellowDuck(); duck.disPlay(); duck.quack(); duck.fly();
设计模式之策略模式
最新推荐文章于 2022-02-18 00:30:00 发布