基于java的设计模式(1)------策略模式

来源:互联网 发布:淘宝买家差评如何修改 编辑:程序博客网 时间:2024/09/21 06:33
文章只是自己在极客学院学习设计模式过程中的一些笔记,便于以后查看

 背景:

在面向对象编程中,使用继承时扩展性问题,如果某个对象的方法增加,在超类添加方法,则其下的子类都继承了这个方法,影响范围太大,出现溢出效应。超类挖的一个坑,每个子类都要来填,增加工作量,复杂度O(N^2)。不是好的设计方式  

解决:

使用策略模式,抽出变化的部分,抽象成接口+实现,就可以在超类里放行为接口对象,在子类里具体设 定行为对象

原则就是:分离变化部分,封装接口,基于接口编程各种功能。这个模式让行为算法的变化独立于算法的使用。

给出demo:

package duck;import strategy_pattern.behavior.FlyBehavior;import strategy_pattern.behavior.QuackBehavior;public abstract class duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public duck() {}public void Fly() {flyBehavior.fly();}public void Quack() {quackBehavior.quack();}public abstract void display();public void swim() {System.out.println("~~im swim~~");}public void setFlyBehavior(FlyBehavior flyBehavior) {this.flyBehavior = flyBehavior;}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}}
package duck;import strategy_pattern.behavior_detial.GaGaQuackBehavior;import strategy_pattern.behavior_detial.GodeFlyBehavior;public class GreenDuck extends duck {public  GreenDuck() {flyBehavior=new GodeFlyBehavior();quackBehavior=new GaGaQuackBehavior();}@Overridepublic void display() {System.out.println("-------greenDuck-----");}}


package duck;import strategy_pattern.behavior_detial.badFlyBehavior;import strategy_pattern.behavior_detial.noQuackBehavior;public class RedDuck extends duck {public  RedDuck() {flyBehavior=new badFlyBehavior();quackBehavior=new noQuackBehavior();}@Overridepublic void display() {System.out.println("-------redDuck-----");}}

package strategy_pattern.behavior;public interface FlyBehavior {void fly();}

package strategy_pattern.behavior;publicinterface QuackBehavior {void quack();};

public class badFlyBehavior implements FlyBehavior {@Overridepublic void fly() {System.out.println("bad fly");}}

public class GaGaQuackBehavior implements QuackBehavior {@Overridepublic void quack() {System.out.println(" GAGA");}}

public class GodeFlyBehavior  implements FlyBehavior{@Overridepublic void fly() {System.out.println("good fly");}}

public class noQuackBehavior implements QuackBehavior {@Overridepublic void quack() {System.out.println("no quack");}}

package test;import duck.GreenDuck;import duck.RedDuck;import duck.duck;import strategy_pattern.behavior_detial.GodeFlyBehavior;import strategy_pattern.behavior_detial.noQuackBehavior;public class test {public static void main(String[] args) {duck greenDuck = new GreenDuck();duck redDuck = new RedDuck();greenDuck.display();greenDuck.Fly();greenDuck.Quack();greenDuck.swim();redDuck.display();redDuck.Fly();redDuck.Quack();redDuck.swim();redDuck.display();redDuck.setFlyBehavior(new GodeFlyBehavior());redDuck.Fly();redDuck.setQuackBehavior(new noQuackBehavior());redDuck.Quack();}}


运行结果:

-------greenDuck-----
good fly
 GAGA
~~im swim~~
-------redDuck-----
bad fly
no quack
~~im swim~~
-------redDuck-----
good fly
no quack

希望对一些朋友有所帮助,如果需要详细的讲解,那得到它的出处了。



原创粉丝点击