-
策略模式抽象出来了一个不变的共性查看全部
-
策略模式查看全部
-
策略模式的适用场景查看全部
-
策略模式适用场景: 1.许多相关的类仅仅是行为差异. 2.运行时选取不同的算法变体. 3.通过条件语句在多个分支中选取.查看全部
-
策略模式的实现步骤: 1.通过分离变化得出的策略接口Strategy. 2.为Strategy接口提供实现类. 3.客户程序父类中存在接口Strategy的引用. 4.客户程序子类中选择正确的Strtegy实现类来注入父类中的Strategy的引用.查看全部
-
策略模式中的设计原则. 如何使应用在不断变更中保持架构稳定呢,这就需要找出应用中变与不变的部分,将不变的部分抽象为接口,而变化部分交给实现去做. 鸭子的飞行行为是千变万化的,但鸭子具有飞行行为本身是不变的,将这不变的部分抽象为飞行策略接口,而将特定种类的鸭子其飞行行为将由实现类去处理. 使用面向接口编程,而非面向实现编程. 多用组合,少用继承.查看全部
-
现加入不会飞行的大黄鸭: 1.需要创建一个FlyingStragety接口的实现类,实现performFly()方法. public class FlyNoWay implements FlyingStragety{ void performFly(){ System.out.println("我不会飞行"); } } 2.创建Duck的实现类(大黄鸭): public class RubberDuck extends Duck{ public RubberDuck(){ super(); //将大黄鸭的飞行接口引用设置为FlyNoWay. super.setFlyingStragety(new FlyNoWay()); } public void display(){ System.out.println("我是大黄鸭"); } } 测试类: Duck duck=new RubberDuck(); duck.display(); duck.quack(); duck.fly(); 可以看到使用策略模式可以在相同情景下轻易复用代码,可以很好的支持变更.查看全部
-
步骤三(进行组合): //需要在鸭子接口中组合该接口. public abstract class Duck{ //组合 private FlyingStragety flyingStragety; //提供set方法 public setFlyingStragety(FlyingStragety flyingStragety){ this.flyingStragety=flyingStragety; } //鸭子飞行方法 public void fly(){ //调用接口声明的飞行方法. flyingStragety.performFly(); } //鸭子发出叫声(通用行为,由超累实现) public void quack(){ System.out.println("嘎嘎嘎"); } //显示鸭子的外观,鸭子的外观各不相同,声明为abstract,由子类实现 public abstract void display(); } 父类中的私有成员不会被继承. 步骤四(注入父类中组合的引用): (因为父类用了private修饰,因此子类不会继承,需要在子类中通过super关键字调用父类公共的set方法进行注入操作) //鸭子的实现类(红头鸭) public class RedheadDuck extends Duck{ public RedheadDuck(){ super(); //注入父类组合引用 super.setFlyingStragety(new FlyWithWin()); } public void display(){ System.out.println("我的头是红色的"); } } //其他鸭子实现类同样如此. 测试: Duck duck=new RedHeadDuck(); duck.display(); duck.quack(); duck.fly();查看全部
-
为鸭子加入飞行行为: 步骤一(创建策略接口): //策略接口,实现鸭子的飞行行为 public interface FlyingStragety{ void performFly(); } 步骤二(创建策略接口实现类,根据业务需要可创建多个实现类): //创建接口实现类 public class FlyWithWin implements FlyingStragety{ //实现鸭子飞行行为方法 public void performFly(){ System.out.println("用翅膀飞"); } }查看全部
-
现要为鸭子加上飞行的功能.方案有三种: 方案一:继承(在父类中提供实现方法,子类通过继承就获得父类中的飞行行为) public void fly(){ System.out.println("用翅膀飞行"); } 优点:简单易用,已有应用可以快速添加飞行能力. 缺点:不具有灵活性,对未来变更支持差,如果添加不能飞行的鸭子和其他飞行方式的鸭子,那么就需要通过子类中重写飞行的方法以提供新的飞行行为,这很容易造成错误(忘写). 方案二:抽象方法(在父类中提供抽象方法,强迫子类实现自己的飞行行为) public abstract void fly(); 优点:足够灵活,不会出现忘记重写fly方法的麻烦,保证每个子类都完成飞行能力. 缺点:代码重复,没有覆用代码,每个子类都要去实现一遍该方法. 方案三:组合,即策略模式(将飞行行为抽象为接口,在父类中持有该接口,并由该接口代理飞行行为) public interface FlyingStragety{ void performFly(); } 将飞行行为抽象为performFly()方法,这个方法将执行鸭子的飞行动作. 最后在父类Duck中持有FiyintStragety的实例.并在fly方法中调用该实例的代理飞行方法. private FlyingStragety flyingStragety; public void fly(){ flyingStragety.performFly(); } 优点:足够灵活,复用性高,更容易维护与应对变化(开闭原则). 仅有一个飞行的接口,并没有涵盖任何一个实现类,根据接口引用的实现类的不同可以完成不同的飞行功能. 缺点:客户代码需要了解每个策略实现的细节(子类需注入一个接口的实现类),增加了对象的数目.查看全部
-
继承是重用代码的利器,但继承并不总是最好的工具. 多用组合,少用继承. 组合(聚合):在类中增加一个私有域,引用另一个已有类的实例,通过调用实例的方法从而获得新的功能,这种设计被称作组合(复合或聚合),具有很强灵活性.查看全部
-
代码例子 鸭子抽象类中存在鸭子的鸣叫以及鸭子的显示方法,现在需要为鸭子加上飞行的功能. //超类,所有鸭子都要继承此类,抽象了鸭子的行为:显示和鸣叫. public abstract class Duck{ //鸭子发出叫声(通用行为,由超类实现) public void quack(){ System.out.println("嘎嘎嘎"); } //显示鸭子的外观,鸭子的外观各不相同,声明为abstract,由子类实现 public abstract void display(); } //鸭子的实现类(红头鸭) public class RedheadDuck extends Duck{ public RedheadDuck(){ super(); } public void display(){ System.out.println("我的头是红色的"); } } //鸭子的实现类(绿脖鸭) public class MallardDuck extends Duck{ public MallardDuck(){ super(); } public void display(){ System.out.println("我的脖子是绿色的"); } }查看全部
-
策略模式(Strategy) 生活中例子:网上购物,当进行支付页面时,会提供很多支付方式,即有很多不同的银行,这些银行都可以完成支付功能,它们的共性就是都能完成支付功能,但它们具体自己是怎样完成支付功能的并不一样. 抽象出不变的部分成为接口,即各大银行都有支付功能,支付功能是大家都有的(共性),则把支付功能抽象为一个接口,每个银行都有自己的支付算法,每个银行类对应一个接口的实现类. 策略模式官方定义: 策略模式将可变的部分从程序中分离,将不变的功能抽象成为算法接口,在该接口下分别封装一系列算法实现.查看全部
-
策略模式的适用场景查看全部
-
策略模式的缺点查看全部
举报
0/150
提交
取消